复合索引排序顺序与查询适配问题:排序相反是否影响查询?
问题解答
1. 查询能否正常执行
该查询完全可以正常执行。MongoDB的查询不会因为索引排序顺序与查询条件不匹配而无法运行——即便没有任何索引,查询也会通过全表扫描返回结果;而此处存在复合索引,查询会借助索引部分加速数据过滤。
2. 排序顺序相反的影响及原因
虽然查询能执行,但索引的使用效率会打折扣,核心原因在于复合索引的存储结构:
- 你创建的复合索引
db.col.createIndex( { A: 1, B: -1 } )存储逻辑为:- 所有文档先按字段
A升序排列; - 同一
A值下的文档,再按字段B降序排列。
- 所有文档先按字段
- 当执行
db.col.find( { A: { $gt: 5 }, B: { $gt: 10 } } )时:- 索引可快速定位到
A > 5的文档区间(利用A的升序索引); - 但在每个
A对应的B降序列表里筛选B > 10时,MongoDB需要从B的最大值开始向下遍历,直到遇到B <= 10的文档才停止扫描。若索引为{A:1, B:1}(B升序),筛选B > 10时可直接定位到B=10的位置,从该点往后的所有B值都满足条件,扫描范围更小、效率更高。
- 索引可快速定位到
- 总结:复合索引中后续字段的范围查询方向与索引排序方向相反时,MongoDB无法利用索引的排序特性快速缩小扫描范围,需要遍历更多索引项完成过滤。
内容的提问来源于stack exchange,提问作者Bear Bile Farming is Torture
相关产品推荐
相关产品推荐

