mongodb系列(二)使用复合索引中要注意字段的前后

背景

预先创建了一个复合索引,分别以 updated_at 和 size 两个字段作为索引依据,其中该collection有94万+个document

db.cms_resources.createIndex({updated_at:-1,size:-1},{name:'index_updated_size_desc'});

实验

开始查询并输出状态信息:

db.cms_resources.find({updated_at:{$lt:1531732138}}).explain(true);

查询策略使用 IXSCAN 这个没毛病

但这次查询按照size字段条件

db.cms_resources.find({size:{$gt:1}}).explain(true);

查询的策略却为COLLSCAN全表查询:

从上面看,好像跟查询的字段顺序是有关系的,验证一下,这次把两个条件updated_at和size都查询,但位置跟复合索引字段位置换一下:

db.cms_resources.find({size:{$lt:1},updated_at:{$gt:1}}).explain(true);

返回状态信息,还是使用了索引策略

结论

1. 建立复合索引,索引中两字段前后顺序与查询条件字段在数量一致的情况下,顺序不影响使用索引查询。

2.当复合索引中的字段数量与查询条件字段数量不一致情况下,以复合索引字段前置优先规则。

猜你喜欢

转载自blog.csdn.net/rcjjian/article/details/81532043