MongoDB聚合管道$or查询未使用索引扫描问题排查
MongoDB聚合$or查询未触发索引扫描的问题解决
问题场景
我在构建聚合管道时,第一个阶段使用$or条件做匹配,但通过explain()分析执行计划时,发现MongoDB并未使用索引扫描,而是执行了全表扫描。
使用的聚合管道代码如下(已修正原代码中$or数组的语法格式错误):
pipeline = [ { $match: { $or: [ { activeTill: Date.now() }, { deleteReason: CONSTANT.NOT_HAPPY } ] } } ];
当前索引情况:仅为deleteReason字段创建了单字段索引,activeTill字段未创建任何索引。
问题原因
MongoDB的$or查询在利用索引时有明确规则:$or中的每一个子查询条件,都必须对应一个独立的单字段索引(或能匹配该条件的复合索引)。只要有一个子条件没有匹配的索引,查询优化器就会判定无法通过索引高效筛选所有符合条件的文档,进而选择全表扫描。
解决方法
为activeTill字段创建单字段索引:
db.yourCollectionName.createIndex({ activeTill: 1 })
索引创建完成后,再次执行explain()查看执行计划,就能看到MongoDB分别通过activeTill和deleteReason的索引扫描符合条件的文档,再合并结果,实现索引优化的查询。
内容的提问来源于stack exchange,提问作者V0idHat
相关产品推荐
相关产品推荐

