【发布时间】:2020-02-08 05:42:44
【问题描述】:
我有一个中型表(大约 350000 个条目并且还在增长)。我需要从表中获取 dev_id 和 var_id 对的最后一个条目。我实际上可以获取它们,但是查询大约需要 20 秒,而且这对于我的目的来说是不可接受的。
我正在使用 MariaDB 在 MySQL 服务器上尝试下一个查询:
select d.dev_id, d.var_id, d.ts, d.value from data_table d
where d.ts > NOW() - INTERVAL 2 DAY
and ts = (SELECT MAX(ts) FROM data_table
WHERE dev_id = d.dev_id
AND var_id = d.var_id)
ORDER BY d.dev_id
表格的结构如下:
id | dev_id | frame_number | var_id | value | ts
1 | 2 | 1 | 2 | 65.5 | 2019-10-10 19:56:05
2 | 3 | 5 | 4 | 23 | 2019-10-10 20:56:06
3 | 2 | 1 | 2 | 65.5 | 2019-10-10 20:59:30
. | . | . | . | . | .
. | . | . | . | . | .
. | . | . | . | . | .
300k| 5 | 100 | 7 | -15.23| 2020-10-10 20:59:30
我需要对类似查询获得更快的响应,但我的经验不足以检测到查询中的瓶颈
编辑 1:我不能省略 ORDER BY,但改进的省略是低的(20 秒对 18.5 秒)
EDIT 3 以及如何修复它:添加(dev_id、var_id 和 ts)作为索引(基于多列的索引)。查询现在只需要 0.6 秒
【问题讨论】:
-
可以添加索引吗?您需要订购吗?
-
我可以添加索引(id),我也可以省略 ORDER BY
-
@manespgav 你的 ID 应该已经被索引了,它是主键。您能否向我们展示您的完整架构,包括索引?
describe data_table将是一个好的开始。explain <your query>也很有帮助。 -
@Schwern 附为图片
-
查看添加的标签。
标签: mysql sql database mariadb groupwise-maximum