2013-07-27 43 views
0

我知道這已經被打敗了 - 但我還沒有看到一個非常好的答案。這裏是我的情況:我有以下查詢:按MySQL排序的另一個分組查詢

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

+1

查詢在限制和分組之前生成多少行? – Joni

+3

如果您沒有任何彙總功能,爲什麼使用組? – Uriil

+1

爲什麼'user_sort'上的索引對不使用該表的查詢有影響? –

回答

0

我想你可以消除group by,如果你沒有在user_top_favorites副本(在user_id, sort_orderitems(上item_id),你也可以做頂部6的選擇join之前。雖然這個物化的表,它是如此之小,沒有性能損失

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)

如果你想牛逼o有點冒險,你可以消除外部order by。 MySQL不保證子查詢的順序,但我認爲你會在實踐中按照你想要的順序得到它們。但是,排序6條記錄確實需要很少的時間。