数据集大小有2亿多。json
一. 因为查询条件有两个,建了两个单独的索引,但仍是很慢,因而查了不少资料。获得如下优化方法。仅供参考。优化
1.创建联合索引,将两个用到的查询字段创建成联合索引。url
2.开启慢查询分析。db.setProfilingLevel(levelNum)code
3. 看执行计划索引
db.getCollection('b2b11467_url').find({"st" : { $ne: 5 },"isCompany":1}).limit(1).explain('executionStats') db.getCollection('b2b11467_url').find({"st" : { $ne: 5 },"isCompany":1}).limit(1).explain() //看winningPlan 就能够看到用了哪一个索引。 "winningPlan" : { "stage" : "LIMIT", "limitAmount" : 1, "inputStage" : { "stage" : "FETCH", "inputStage" : { "stage" : "IXSCAN", "keyPattern" : { "st" : 1, "isCompany" : 1 }, "indexName" : "st_isCompany", //索引名称,这里是个组合索引 "isMultiKey" : false, "isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 1, "direction" : "forward", "indexBounds" : { //索引详细信息 "st" : [ "[MinKey, 5.0)", "(5.0, MaxKey]" ], "isCompany" : [ "[1.0, 1.0]" ] } } } }
结论: 若是是两个单独的索引,即便用到了两个查询条件都有索引,他最后只会命中一个,创建联合索引速度快不少。 由2s -> 100+ ms ,发生了质的突破get
2、查看当前执行的语句 input
1.首先登录到系统管理员帐户 use admin db.auth('xxx','xxxxx') 2.执行命令 db.currentOp()