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