MySQL查询的优化

MySQL查询的优化,mysql,Mysql,我正在使用一个MySQL数据库来存储来自某个能量测量系统的值。问题是数据库包含数百万行,查询需要花费一些时间才能完成。这些查询是最优的吗?我应该做些什么来改进它们 数据库表由各有15列的行组成(t、UL1、UL2、UL3、PL1、PL2、PL3、p、Q1、Q2、Q3、CosPhi1、CosPhi2、CosPhi3、i),其中t是时间,p是总功率,i是某个标识符 当我以不同间隔(15分钟、1小时、1天、1个月)分组的图形显示数据时,我希望对查询进行分组 作为一个例子,我有一个图表,显示了当前一年中

我正在使用一个MySQL数据库来存储来自某个能量测量系统的值。问题是数据库包含数百万行,查询需要花费一些时间才能完成。这些查询是最优的吗?我应该做些什么来改进它们

数据库表由各有15列的行组成(t、UL1、UL2、UL3、PL1、PL2、PL3、p、Q1、Q2、Q3、CosPhi1、CosPhi2、CosPhi3、i),其中t是时间,p是总功率,i是某个标识符

当我以不同间隔(15分钟、1小时、1天、1个月)分组的图形显示数据时,我希望对查询进行分组

作为一个例子,我有一个图表,显示了当前一年中每天的kWh。收集数据的查询如下所示:

SELECT t, SUM(P) as P 
FROM table 
WHERE i = 0 and t >= '2015-01-01 00:00:00' 
GROUP BY DAY(t), MONTH(t) 
ORDER BY t
数据库已经收集了13天的测量数据,仅此查询就需要2-3秒才能完成。在这13天里,数据库增加了大约1-130万行,因为每秒都会增加一行


这个查询是最优的吗?

我实际上会创建一个辅助表,其中每天有一列,总有一列。然后,通过触发器,插入到细节表中可以更新辅助聚合表。通过这种方式,您可以对每日表求和,这将快得多,但如果需要查看粒度级别的详细信息,仍然可以使用每秒表


拥有聚合表可以为查询节省大量时间,特别是对于只读类型的数据或您知道不会更改的数据。然后,如果您想要更精细的细节,如每小时或15分钟的间隔,请直接转到原始数据。

我实际上会创建一个二级表,其中每天有一列,总有一列。然后,通过触发器,插入到细节表中可以更新辅助聚合表。通过这种方式,您可以对每日表求和,这将快得多,但如果需要查看粒度级别的详细信息,仍然可以使用每秒表


拥有聚合表可以为查询节省大量时间,特别是对于只读类型的数据或您知道不会更改的数据。然后,如果您想要更精细的细节,如每小时或15分钟的间隔,请直接转到原始数据。

我实际上会创建一个二级表,其中每天有一列,总有一列。然后,通过触发器,插入到细节表中可以更新辅助聚合表。通过这种方式,您可以对每日表求和,这将快得多,但如果需要查看粒度级别的详细信息,仍然可以使用每秒表


拥有聚合表可以为查询节省大量时间,特别是对于只读类型的数据或您知道不会更改的数据。然后,如果您想要更精细的细节,如每小时或15分钟的间隔,请直接转到原始数据。

我实际上会创建一个二级表,其中每天有一列,总有一列。然后,通过触发器,插入到细节表中可以更新辅助聚合表。通过这种方式,您可以对每日表求和,这将快得多,但如果需要查看粒度级别的详细信息,仍然可以使用每秒表

拥有聚合表可以为查询节省大量时间,特别是对于只读类型的数据或您知道不会更改的数据。然后,如果您想要更精细的细节,如每小时或15分钟的间隔,请直接转到原始数据。

对于此查询:

SELECT t, SUM(P) as P 
FROM table 
WHERE i = 0 and t >= '2015-01-01 00:00:00' 
GROUP BY DAY(t), MONTH(t) 
ORDER BY t
最佳索引是覆盖索引:
表(i,t,p)

2-3秒(超过100万行)表明您已经有了索引

你可能需要考虑DRapp的建议并使用汇总表。几个月后,您将拥有大量数据,历史查询可能需要很长时间

不过,与此同时,索引和分区可能会为您的需求提供足够的性能。

对于此查询:

SELECT t, SUM(P) as P 
FROM table 
WHERE i = 0 and t >= '2015-01-01 00:00:00' 
GROUP BY DAY(t), MONTH(t) 
ORDER BY t
最佳索引是覆盖索引:
表(i,t,p)

2-3秒(超过100万行)表明您已经有了索引

你可能需要考虑DRapp的建议并使用汇总表。几个月后,您将拥有大量数据,历史查询可能需要很长时间

不过,与此同时,索引和分区可能会为您的需求提供足够的性能。

对于此查询:

SELECT t, SUM(P) as P 
FROM table 
WHERE i = 0 and t >= '2015-01-01 00:00:00' 
GROUP BY DAY(t), MONTH(t) 
ORDER BY t
最佳索引是覆盖索引:
表(i,t,p)

2-3秒(超过100万行)表明您已经有了索引

你可能需要考虑DRapp的建议并使用汇总表。几个月后,您将拥有大量数据,历史查询可能需要很长时间

不过,与此同时,索引和分区可能会为您的需求提供足够的性能。

对于此查询:

SELECT t, SUM(P) as P 
FROM table 
WHERE i = 0 and t >= '2015-01-01 00:00:00' 
GROUP BY DAY(t), MONTH(t) 
ORDER BY t
最佳索引是覆盖索引:
表(i,t,p)

2-3秒(超过100万行)表明您已经有了索引

你可能需要考虑DRapp的建议并使用汇总表。几个月后,您将拥有大量数据,历史查询可能需要很长时间


不过,与此同时,索引和分区可能会为您的需求提供足够的性能。

我记得有人为了家庭供暖账单解决了这个问题。五个人花了一个小时来优化分秒sillines有些无法回答,除非你描述了索引的位置-这些是关键的。你可能需要更多的行!!!见正常化!每次都是从0开始还是这是滚动的窗户?我记得那个家伙为了他的家庭取暖账单解决了这个问题。五个人花了一个小时来优化分秒sillines有些无法回答,除非你描述了索引的位置-这些是关键的。你可能需要更多的行!!!见正常化!每次都是从0开始还是这是滚动窗口?我记得有人解决了这个问题