You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB复合索引性能对比、匹配规则与字段顺序有效性问题

MongoDB复合索引性能与适用场景问题解答

问题1:查询collection.find({'x':'foo','y':'bar'})使用{'x':1,'y':1}复合索引与{'x':1,'y':1,'z':1}复合索引的性能是否一致?

二者性能不一致,{'x':1,'y':1}复合索引的查询性能会略优,原因如下:

  • 二者都可以被该查询命中:MongoDB复合索引遵循最左前缀匹配原则,{'x':1,'y':1,'z':1}的前两位字段正好匹配查询的过滤条件,因此可以正常被该查询使用。
  • 性能差异来自索引条目大小:{'x':1,'y':1}的索引条目仅存储x、y的字段值与对应文档指针,{'x':1,'y':1,'z':1}的索引条目还额外存储了z的字段值,单个条目占用空间更大。在数百万条记录的场景下,相同大小的内存页能缓存的{'x':1,'y':1}索引条目数量更多,磁盘IO、内存换页的开销更低,因此查询速度更快。

问题2:复合索引{'x':1,'y':1,'z':1}与{'y':1,'z':1,'x':1}的作用是否完全相同?

二者作用完全不同,核心差异同样来自最左前缀匹配规则:

  • {'x':1,'y':1,'z':1}仅能支持以x、x+y、x+y+z为过滤前缀的查询,也仅能支持对应顺序的字段排序;无法高效支持不带x字段的过滤、排序请求,比如查询{'y':'bar','z':'test'}几乎无法利用该索引提速。
  • {'y':1,'z':1,'x':1}仅能支持以y、y+z、y+z+x为过滤前缀的查询和对应顺序的排序;无法高效支持不带y字段的过滤、排序请求,比如查询{'x':'foo','y':'bar'}利用该索引的效率极低。

内容的提问来源于stack exchange,提问作者Onur Öztürk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 22:36:00