在大型数据集上按周计算平均值(AVG)和分组花费的时间太长

时间:2010-04-09 21:08:31

标签: mysql group-by average

我按周计算了700万行的平均价格,这需要大约30秒才能完成工作。

这是一个简单的查询:

SELECT AVG(price) as price, yearWEEK(FROM_UNIXTIME(timelog)) as week from pricehistory where timelog > $range and product_id = $id GROUP BY week

实际获得数据变化的唯一一周并且每次都值得平均,这始终是最后一周,因此整个期间的计算是浪费资源。我只是想知道mysql是否有一个工具来帮助解决这个问题。

2 个答案:

答案 0 :(得分:1)

您是否尝试过索引字段?

我不是MySQL中的DDL专家,但在这种情况下我会说timelog应该有一个聚簇索引,然后应该为product_id声明非聚集索引。另外,最好在表中添加一个新字段,用于存储“周”值并将其编入索引。它需要更多的空间,但这样你就不会每次都进行相同的计算。

答案 1 :(得分:1)

我建议在(product_id,timelog)上创建一个新的复合BTREE索引,并改变WHERE子句中的条件顺序:

SELECT
    AVG(price) as price,
    yearWEEK(FROM_UNIXTIME(timelog)) as week
from pricehistory
where product_id = $id AND timelog > $range 
GROUP BY week

如果您已经在(product_id)上有BTREE索引,只需将其扩展为(product_id,timelog)