MongoDB findOne中$or查询非全索引条件是否会使用索引?
MongoDB $or 与 findOne 的索引使用规则解析
核心结论:
findOne不会因为仅需返回单个文档就绕过$or的索引规则——只要$or子句中存在无索引支持的字段,MongoDB 依然会执行全集合扫描,不会优先使用有索引的子句去查找匹配项。执行逻辑说明:MongoDB 对
$or查询的执行逻辑是统一的,不管是find还是findOne,都会先校验所有$or子句的索引覆盖情况。只要有任意一个子句没有对应的索引,就会触发全集合扫描,因为它需要遍历集合中的每一个文档,逐一检查是否满足任意一个$or条件。验证方法:虽然
findOne无法直接调用explain(),但可以将查询改为find()配合limit(1),再通过explain()查看执行计划,二者的执行逻辑基本一致:db.users.find( { $or: [ { email : 'someUser@gmail.com' }, { username: 'some-user' } ] } ).limit(1).explain("executionStats")查看执行计划中的
executionStats.totalDocsExamined字段:如果数值等于集合总文档数,说明是全集合扫描;如果数值很小,则代表使用了索引。优化建议:要让这类查询高效执行,需给
$or条件中的所有字段都建立索引。当所有子句都有索引支持时,MongoDB 会并行使用多个索引查找匹配项,找到第一个符合条件的文档后就会停止,性能会显著提升。
内容的提问来源于stack exchange,提问作者Tyler Nielsen
相关产品推荐
相关产品推荐

