我正在使用MySQL数据库来存储某些能量测量系统的值。问题是数据库包含数百万行,查询需要很长时间才能完成。查询是否最佳?我该怎么做才能改善它们?
数据库表由每行15列的行组成(t,UL1,UL2,UL3,PL1,PL2,PL3,P,Q1,Q2,Q3,CosPhi1,CosPhi2,CosPhi3,i),其中t为时间, P是总功率,我是一些标识符。
当我以不同的间隔(15分钟,1小时,1天,1个月)分组的图表中显示数据时,我想将查询分组。
作为一个例子,我有一个图表,显示当年每天的千瓦时。收集数据的查询如下:
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万行,因为每秒都会添加一行新的行。
此查询是否最佳?
答案 0 :(得分:2)
我实际上会创建一个辅助表,其中每个DAY都有一列,总共有一列。然后,通过触发器,插入详细信息表可以更新辅助聚合表。这样,您可以对DAILY表进行求和,这样会更快,但如果您需要查看粒度级别的详细信息,仍然可以使用每秒表。
拥有聚合表可以是查询的常见时间,特别是对于只读类型的数据,或者您知道不会更改的数据。然后,如果您需要更精细的细节,例如每小时或15分钟的间隔,请直接转到原始数据。
答案 1 :(得分:1)
对于此查询:
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
最佳指数是覆盖指数:table(i, t, p)
。
超过1百万行的2-3秒表明您已经拥有索引。
您可能需要考虑DRapp的建议并使用汇总表。在几个月内,您将拥有大量数据,以至于历史查询可能需要很长时间。
与此同时,索引和分区可能会为您的需求提供足够的性能。