以下查询相对较慢(约 6k 行 0.7 秒)
SELECT items.*, COUNT(transactions.ID)
FROM items
INNER JOIN users ON (items.USER = users.ID)
LEFT JOIN transactions ON (items.id = transactions.item)
WHERE items.ACTIVE = 1
AND items.DELETED_AT IS NULL
GROUP BY items.ID
ORDER BY items.DATE DESC
LIMIT 20
但是当按 items.ID DESC 而不是 items.DATE 排序时,速度会显着加快。事务连接到一个大表(~250k 行)并且是一对多的。日期列有一个索引。
有什么方法可以普遍提高 ORDER BY 的性能吗?
编辑:items.user、transactions.item 和 items.date 的索引。项目有 49 列,用户 76 列,交易 17 列。
最佳答案
索引会影响 ORDER BY
子句的性能。这MySQL manual page可能值得你花时间。本质上,如果您按作为 MySQL 用于查询的索引的一部分的列排序,MySQL 可以使用索引而不是数据本身进行排序。
在您的特定查询中,DATE
列具有索引这一事实并不重要,因为该索引可能未在您的查询中使用。您的 WHERE
语句包含 items.ACTIVE
和 items.DELETED_AT
,如果这些列具有用于 WHERE< 的索引
不包含 DATE
列,则 MySQL 无法使用该索引按 DATE
进行排序,并且可能会求助于文件排序。
如果您能想出一个可以同时被 WHERE
和 ORDER BY
使用的索引,您将获得优化提升。在这种情况下,items.ACTIVE
似乎是一个低基数列,因此假设 items.DELETED_AT
是一个日期,我可能会尝试使用 INDEX(DELETED_AT ,DATE)
该表。
使用EXPLAIN SELECT...
要了解更多关于那里正在发生的事情,您可能会获得一些进一步的见解。
关于MySQL 慢分组依据/排序依据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8631488/