2015-02-08 63 views
0

我有一個簡單的查詢,並按順序(與連接),但它似乎沒有工作沒有臨時表和文件。下面是該查詢:正確的MySQL索引這個簡單的查詢

SELECT items.name, max(activity.created_at), count(items.item_id) as total_count 
FROM activity 
INNER JOIN items ON activity.item_id = items.item_id 
WHERE activity.user_id = 'XXX' 
GROUP BY activity.item_id 
order by activity.created_at desc 
LIMIT 0, 15 

我有一個指標:

(activity.item_id, activity.user_id, activity.created_at) - idx_item_created 
(activity.user_id, activity.created_at) - user_id_2 

當我強迫idx_item_created它進行全表掃描,默認情況下它運行使用user_id_2和總產:

Using where; Using temporary; Using filesort 

無論如何優化此查詢更好?

+0

我建議給max(activity.created_at)一個別名並按此排序。 – 2015-02-08 14:48:13

回答

0

因爲你有group byorder by有兩個不同的表達式,你將不得不有一個文件夾。對於該查詢:

SELECT items.name, max(activity.created_at), count(items.item_id) as total_count 
FROM activity INNER JOIN 
    items 
    ON activity.item_id = items.item_id 
WHERE activity.user_id = 'XXX' 
GROUP BY activity.item_id 
order by activity.created_at desc 
LIMIT 0, 15 

最好的指數是上activity覆蓋索引:activity(user_id, item_id, created_at)。但是,這不會消除文件排序。

+0

這個指數有什麼問題? (activity.item_id,activity.user_id,activity.created_at) – gregavola 2015-02-08 14:54:12

+0

@gregavola。 。 。 'user_id'不是索引中的第一個鍵,所以它不使用索引進行過濾。 – 2015-02-08 15:05:12

+0

這似乎不工作 - 我試圖添加新的索引 - 但最終結果是它使用索引 - 但(仍然使用臨時) – gregavola 2015-02-10 02:22:32