另一组按​​MySQL查询订单

时间:2013-07-27 13:35:28

标签: mysql filesort

我知道这已被打成了纸浆 - 但我还没有看到一个非常好的答案。这是我的情况:我有以下查询:

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表。

1 个答案:

答案 0 :(得分:0)

如果您在group byuser_top_favoritesuser_id, sort_orderitems上)没有重复项,我认为您可以删除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条记录确实需要花费很少的时间。