参考原文:http://www.mongoing.com/eshu_explain3
理想的查询状态由以下两种
普通查询:
nReturned=totalKeysExamined & totalDocsExamined=0
(cover index,仅仅使用到了index,无需文档扫描,这是最理想状态。)
或者
nReturned=totalKeysExamined=totalDocsExamined(需要具体情况具体分析)
(正常index利用,无多余index扫描与文档扫描。)
sort大数据的时候,为了使得sort不在内存中进行
totalKeysExamined > nReturned=totalDocsExamined
备注:很多时候改变索引的顺序可以极大的增加查询效率。可以通过explain()来查看执行语句的上面三个数值。
举例:
集合tmp:数据量:2000万
包含字段 long a, enum b, int c
db.tmp.find({ "c" : 181 , "b" : "bType", "a" : { "$gte" : 1473139260000 , "$lte" : 1473225660000})
每一个单独建索引只会使用单个索引。且totalDocsExamined远大于其它两个值
考虑建立多条索引:因为c和b的数目相对较少,因此将b和c放索引前面。a放最后。
可以得到nReturned=totalKeysExamined & totalDocsExamined=0
项目优化mongo步骤
1. 列出原始日志表与统计表;
2. 列出每个表的查询条件;
3. 列出每个表的索引;
4. 列出查询慢的语句;