0

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

上述查询中的 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 表以适应更好的解决方案。

一种可能的解决方案是添加新列并解析 EPOCH 时间以提取 DATE、TIME 等字段并使用适当的值更新新创建的列,以便GROUP BY变得更容易。

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

注意 - 记录使用 mysql 5.1 和 Infobright 引擎。当前查询大约需要 3 分钟来执行(因为 GROUP BY CLAUSE)。性能目标是将其控制在 30 秒以下。

4

1 回答 1

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,但您没有提到在数据存储中“首选”哪个键。WHEREInfobright 将跳过与子句不匹配的 64K 行块;你在利用它吗?如果不是,则需要从所有块中解压缩所有相关列。

汇总表——然而,它并不是在考虑 Infobright 的情况下编写的。

于 2016-03-02T02:32:20.470 回答