在mysql表上使用EPOCH时的GROUP BY子句

时间:2016-03-01 18:18:23

标签: mysql performance group-by epoch infobright

我在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>;

问题是

  1. 这是一个有效的查询吗?
  2. 如果不是,那会是更好的方法吗?
  3. 打开以使用ALTER表来提供更好的解决方案。
  4. 可能的解决方案之一可能是添加新列并解析EPOCH时间以提取DATE,TIME等字段并使用适当的值更新新创建的列,以便 GROUP BY 变得更容易。

    想知道这是否是一个明智的解决方案?

    注意 - 对于记录使用mysql 5.1和Infobright引擎。当前查询使用大约3分钟来执行(因为GROUP BY CLAUSE)。性能目标是将其降低30秒。

1 个答案:

答案 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写的。