mysql - 此简单查询的正确 MySQL 索引

标签 mysql sql optimization

我有一个简单的查询,它执行分组依据和排序依据(带有连接),但如果没有临时表和文件排序,它似乎无法工作。这是查询:

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

有什么办法可以更好地优化这个查询吗?

最佳答案

您必须对此进行文件排序,因为您有 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)。不过,这不会消除文件排序。

关于mysql - 此简单查询的正确 MySQL 索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28395185/

相关文章:

sql - 如何在SSAS多维中显示实际上没有值的维度成员?

optimization - Deflate 压缩浏览器兼容性以及相对于 GZIP 的优势

c++ - 仅优化调试配置中的单个方法

java - 使用 JPA 插入数据后应用程序不会终止

MySQL 搜索文本时考虑到小错误

Java ResultSet getDouble() 不需要的舍入

c++ - char* 与先前指令中设置的值的比较未优化?

mysql - 在 SQL : Error 中使用转换语句

php - SQL查询错误找不到列

mysql - 检查数据库中以出生日期格式存储在列中的值