如何让我的mysql每月获得一条记录更快?

时间:2015-12-12 12:15:14

标签: mysql

我有一个包含大约300万条记录的大型数据库,其记录包含时间戳。

现在我想每月选择一条记录,它可以使用此查询:

SELECT timestamp, id, gas_used, kwh_used1, kwh_used2 FROM energy 
GROUP BY MONTH(timestamp) ORDER BY timestamp ASC

它有效,但速度很慢。

我在idtimestamp上有索引。

如何快速完成此查询?

2 个答案:

答案 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