我知道这已被打成了纸浆 - 但我还没有看到一个非常好的答案。这是我的情况:我有以下查询:
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
表。
答案 0 :(得分:0)
如果您在group by
(user_top_favorites
和user_id, sort_order
(items
上)没有重复项,我认为您可以删除item_id
。您也可以在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条记录确实需要花费很少的时间。