前缀字段多值过滤场景下复合索引是否失效?若有效其工作机制是什么?
复合索引在$in查询下的有效性及处理机制
索引会失效吗?
不会,MongoDB完全能用上你创建的{A: 1, B: 1}复合索引来处理这个查询。
具体处理逻辑
针对前缀字段A用$in匹配多个值的情况,MongoDB会通过多区间索引扫描来处理:
- 把
$in数组里的每个值(1、2、3)单独拿出来,分别在复合索引里定位A=当前值且B=50的索引区间 - 然后把这些区间扫描到的结果合并、去重,最终返回符合条件的文档
- 说白了,就相当于把原查询拆成了三个独立的复合索引查询:
db.col_name.find({A: 1, B: 50})、db.col_name.find({A: 2, B: 50})、db.col_name.find({A: 3, B: 50}),MongoDB内部会高效完成这些扫描和结果合并,根本不用走全表扫描
如果想确认索引确实在工作,你可以跑db.col_name.explain().find({A: {$in: [1, 2, 3]}, B: 50})看执行计划,里面的stage字段会显示IXSCAN,这就说明索引正在被使用。
内容的提问来源于stack exchange,提问作者Bear Bile Farming is Torture
相关产品推荐
相关产品推荐

