MongoDB索引性能疑问:重复字段查询与合并条件查询是否等效?
MongoDB复合索引下两个查询的性能差异
这两个查询的性能完全不一致,核心问题出在查询1的语法错误上,导致两者的实际执行逻辑天差地别:
查询1的实际执行逻辑:
MongoDB的查询文档中如果出现重复键,只会保留最后一个键值对。所以查询1里的fieldB: {"$gt": 5}会被后面的fieldB: {"$lt": 10}覆盖,实际执行的查询是:{fieldA : "A", fieldB: {"$lt" : 10}, "fieldC" : "C"}这个查询只会利用复合索引的
fieldA前缀匹配等值条件,然后在fieldA="A"的范围内匹配fieldB<10,最后过滤fieldC="C",索引利用效率有限,且返回的结果集包含fieldB<=5的文档,数据量更大。查询2的实际执行逻辑:
查询2是正确的复合范围查询,逻辑为fieldA="A"且5<fieldB<10且fieldC="C",能完整利用{fieldA, fieldB, fieldC}的复合索引:先精准匹配fieldA="A",再在该范围内匹配fieldB的区间条件,最后快速过滤fieldC="C"的文档,索引利用效率更高,返回结果集更小,性能自然更优。
内容的提问来源于stack exchange,提问作者Taha Hussain
相关产品推荐
相关产品推荐

