0

我知道这已经被打败了——但我还没有看到一个真正有效的好答案。这是我的情况:我有以下查询:

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

这里避免临时和文件排序的正确索引是什么?

UPDATE: user_sort只是我创建的索引的名称,该索引属于user_top_favorites表中。

4

1 回答 1

0

我认为可以消除, 如果在(on和(on )group by中没有重复项。您也可以在 之前进行前 6 名的选择。虽然这实现了一个表,但它是如此之小以至于没有表现打。user_top_favoritesuser_id, sort_orderitemsitem_idjoin

    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 条记录进行排序确实需要很短的时间。

于 2013-07-27T14:03:19.597 回答