MAX() slow query



我有这个查询来获取按电话号码分组的最近的对话,但是查询时间太慢了。怎样才能更快呢?

SELECT * from messages WHERE id IN (SELECT max(id) from messages GROUP BY phone) AND chat = :ch AND status = :st AND seller_id = :seller ORDER BY created_at DESC

DB Version 10.2.44-MariaDB

加快查询速度的主要方法之一是向所涉及的列添加索引。向id列添加索引将加快查询速度(如果上面没有索引)。

正如@danblack在评论中提到的,MariaDB有一个EXPLAIN特性来分析查询。然后可以使用分析来优化查询。

还有更复杂的技术来加速查询,比如编写存储过程,如果上面的方法不起作用

这将显著加快子查询的速度:

INDEX(phone)

我假设你已经有了' PRIMARY KEY(id).

这个重新表述可能改进查询计划:

SELECT messages.*
FROM ( SELECT MAX(id) AS maxid FROM messages GROUP BY phone ) AS x
JOIN messages  ON messages.id = x.maxid
WHERE  chat = :ch
AND  status = :st
AND  seller_id = :seller
ORDER BY  created_at DESC

存储过程的帮助不足以保证它的使用。

在询问性能问题时应始终包括EXPLAIN SELECT ...SHOW CREATE TABLE

最新更新