2015-02-08 61 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