我有一个包含大约300万条记录的大型数据库,其记录包含时间戳。
现在我想每月选择一条记录,它可以使用此查询:
SELECT timestamp, id, gas_used, kwh_used1, kwh_used2 FROM energy
GROUP BY MONTH(timestamp) ORDER BY timestamp ASC
它有效,但速度很慢。
我在id
和timestamp
上有索引。
如何快速完成此查询?
答案 0 :(得分:3)
GROUP BY MONTH(timestamp)
强制引擎单独查看每条记录,也就是顺序扫描,当你有30M记录时,这显然非常慢。
一个常见的解决方案是添加一个索引列,其中只包含您要选择的标准。但是,如果您的数据库没有每年重置,我强烈怀疑您实际上是想在年月选择。
为避免数据损坏问题,最好创建一个自动填充该字段的插入触发器。这样,这个额外的列不会干扰您的业务逻辑。
答案 1 :(得分:1)
选择未出现在GROUP BY语句中的列不是一个好习惯,除非使用聚合函数(如MIN(),MAX(),SUM()等处理它们。
在您的查询中,这适用于列:
id, gas_used, kwh_used1, kwh_used2
在这种情况下,您不会获得每个月的“最早”(按时间戳)行。
更多: https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html