我有以下查询:
SELECT * FROM items
WHERE collection_id = 10
ORDER BY item_order ASC,id DESC
LIMIT 25
现在我有两个索引,一个在collection_id,id上,另一个在collection_id,item_order上。 如果用户没有为项目指定订单,则item_order可以为null,在这种情况下,我希望它们按id排序。
我的索引设置是否最佳,或者有没有办法让一个三列索引同时处理id和item_order的排序?将“collection_id”列索引两次似乎是多余的。
答案 0 :(得分:3)
此查询的最佳索引为(collection_id,id,item_order)
。
MySQL每个查询只会为每个表使用一个索引,它会按查询中的列顺序查找匹配的索引。确定此查询的索引应该是什么样的最简单方法是查看ORDER BY条件后面的WHERE条件。
如果有疑问,请大量使用EXPLAIN,并确保不会不必要地创建临时表或使用filesort。
答案 1 :(得分:1)
在select语句之前使用EXPLAIN会告诉你它正在使用哪些索引。官方文档在这里:
这里有一个很好的教程:
答案 2 :(得分:0)
对于上面的查询,理想的索引将是(collection_id,item_order,id)。
多次索引同一列绝不是浪费时间 - 只要你没有最终得到两个相同的索引或从未使用过的索引。