我知道这已经被打得落花流水了,但我还没有看到一个真正有效的答案。这是我的情况:我有以下问题:
SELECT items.item_name, sort_order as total_count, user_top_favorites.item_id.item_id
FROM user_top_favorites
INNER JOIN items ON user_top_favorites.item_id = items.item_id
WHERE user_top_favorites.user_id = 1
GROUP by user_top_favorites.item_id.item_id
ORDER BY sort_order asc
LIMIT 0 , 6
我尝试了以下索引:
user_sort (user_id, item_id, sort_order)
user_sort (item_id, user_id, sort_order)
user_sort (user_id, sort_order, item_id)
我总是得到:Using temporary; Using filesort
避免临时和文件排序的正确索引是什么?
更新:user_sort
只是我创建的索引的名称,该索引属于user_top_favorites
表。
如果user_top_favorites
(在user_id, sort_order
和items
(在item_id
上)中没有重复,我认为您可以消除group by
。您也可以在join
之前选择前6个。尽管这具体化了一个表,但它太小了,没有性能上的影响。
SELECT i.item_name, utf.sort_order as total_count, utf.item_id.item_id
FROM (select utf.*
from user_top_favorites utf
where utf.user_id = 1
order by utf.sort_order
limit 6
) utf join
items i
ON utf.item_id = i.item_id
ORDER BY utf.sort_order asc;
如果您需要此查询,那么以下索引应该有助于提高性能:user_top_favorites(user_id, sort_order)
和items(item_id)
。
如果你想有一点风险,你可以消除外部的order by
。MySQL并不保证子查询的顺序,但我认为在实践中你会按照你想要的顺序得到它们。然而,对6条记录进行排序确实需要花费少量的时间。