【发布时间】:2012-01-27 17:23:17
【问题描述】:
以下查询相对较慢(0.7 秒,约 6k 行)
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 列。
【问题讨论】:
-
你能提供三个表的架构,尤其是索引吗?
-
我唯一能想到的就是首先选择由 WHERE 子句过滤并在子查询中按日期排序的项目,(或者在视图中,如果 MySQL 不支持子查询中的 ORDER BY,)然后在一个封闭的查询中做你的连接。 (我不会写这个作为答案,因为 SO 不鼓励投机性的答案。)
-
您是否尝试在
GROUP BY中包含items.DATE(也位于第一位)?
标签: mysql performance join sql-order-by