背景
预先创建了一个复合索引,分别以 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.当复合索引中的字段数量与查询条件字段数量不一致情况下,以复合索引字段前置优先规则。