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
相关产品推荐
相关产品推荐

