Mysql:将这两个索引合并为一个索引?

Mysql:将这两个索引合并为一个索引?,mysql,Mysql,我有以下疑问: SELECT * FROM items WHERE collection_id = 10 ORDER BY item_order ASC,id DESC LIMIT 25 现在我有两个索引,一个是关于集合id,id,另一个是关于集合id,item,order。 如果用户没有为项目指定顺序,则项目的顺序可以为空,在这种情况下,我希望它们按id排序 我的索引设置是最优的,还是有一种方法可以让一个三列索引同时处理id和项目顺序排序?对“collection\u id”列进行两次

我有以下疑问:

SELECT * FROM items 
WHERE collection_id = 10 
ORDER BY item_order ASC,id DESC 
LIMIT 25
现在我有两个索引,一个是关于集合id,id,另一个是关于集合id,item,order。 如果用户没有为项目指定顺序,则项目的顺序可以为空,在这种情况下,我希望它们按id排序


我的索引设置是最优的,还是有一种方法可以让一个三列索引同时处理id和项目顺序排序?对“collection\u id”列进行两次索引似乎是多余的。

对于上面的查询,理想的索引应该是(collection\u id、item\u order、id)


对同一列多次编制索引决不是浪费时间——只要您没有得到两个相同的索引,或者从未使用过的索引。

此查询的最佳索引是
(集合id、id、项目顺序)

MySQL在每个查询中每个表只使用一个索引,并且它会按查询中列的顺序查找匹配的索引。确定此查询的索引应该是什么样的最简单方法是查看WHERE条件和orderby条件


如有疑问,请随意使用EXPLAIN,并确保它没有不必要地创建临时表或使用filesort。

在select语句之前使用EXPLAIN将告诉您它正在使用哪些索引。官方文件如下:

这里有一个很好的教程:


对不起,所有者实际上不应该是查询的一部分(更新了问题)。我需要按集合_id,id进行索引,以便按id DESC进行有效排序,对吗?(id是自动递增列)如果
id
是自动递增的,则在id之后按项目顺序排序(就像您在示例中所做的那样)是多余的-标识列上不应该有任何关联。威尔:我不确定是否理解。用户可以手动指定项目顺序,即项目顺序。因此,如果item_order不为null,它应该按该值排序,而不是按id排序。@makeee-那么您的查询中应该有
order by item_order,id
?没问题。我的答案已更新以反映这一点-注意,我建议的索引中列的顺序已更改。对不起,所有者实际上不应该是查询的一部分(更新了问题)。那么集合id,id,物品订单?