0

我每周获得 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是否有工具可以帮助解决这个问题。

4

2 回答 2

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)

于 2010-04-09T23:03:53.913 回答
1

您是否尝试过索引字段?

我不是 MySQL 的 DDL 专家,但在这种情况下,我会说 timelog 应该有一个聚集索引,然后应该为 product_id 声明非聚集索引。此外,向表中添加一个新字段也是一个好主意,用于存储“周”值并对其进行索引。它会占用更多空间,但这样您就可以避免每次都进行相同的计算。

于 2010-04-09T21:28:48.610 回答