我在mysql表 TEST 中有几百万条记录。
TEST 表的一列( TRIAL_TIME )将EPOCH时间存储为BIGINT。触发了一个sql查询,该查询使用 GROUP BY 子句对TRIAL_TIME上的数据进行分组。
查询是这样的。
SELECT SUM(A1), COUNT(B1)
from TEST
WHERE <some clause>
GROUP BY TRIAL_TIME DIV 300000
ORDER BY <some column>;
上面查询中的<300> 300000表示我想要将数据分组的时间。例如,如果我想将数据分组1分钟,我会使用60000.然后查询变为
SELECT SUM(A1), COUNT(B1)
from TEST
WHERE <some clause>
GROUP BY TRIAL_TIME DIV 600000
ORDER BY <some column>;
问题是
可能的解决方案之一可能是添加新列并解析EPOCH时间以提取DATE,TIME等字段并使用适当的值更新新创建的列,以便 GROUP BY 变得更容易。
想知道这是否是一个明智的解决方案?
注意 - 对于记录使用mysql 5.1和Infobright引擎。当前查询使用大约3分钟来执行(因为GROUP BY CLAUSE)。性能目标是将其降低30秒。
答案 0 :(得分:1)
WHERE ... -- With a good index, this _might_ be less of a problem; otherwise it needs scan
GROUP BY FLOOR(ts/300000) -- adding a column will not help
ORDER BY something_else -- this will force [another] sort
您要扫描多少行?如果它是一个很大的数字,如果没有某种形式的汇总表,那么期望高速是不合理的。
你提到了Infobright,但你没有提到哪个键是首选的&#39;在存储数据。 Infobright将跳过与WHERE
子句不匹配的64K行的块;你在利用这个吗?如果没有,则需要从所有块中解压缩所有相关列。
Summary tables - 但是,它不是用Infobright写的。