MongoDB索引Index应用之慢查询分析
似乎数据库都提供explain功能,利用其进行MongoDB慢查询实践分析前先准备实践数据:
1、产品表products
products中添加200多万的数据。
2、订单表orders
参考MySQL索引原理之慢查询等优化 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中慢查询优化的过程,MongoDB也是类似的过程:
1、开启内置的查询分析器,记录读写操作效率
db.setProfilingLevel(n,m),n的取值可选0,1,2
0:表示不记录
1:表示记录慢速操作,如果值为1,m必须赋值单位为ms,⽤于定义慢速查询时间的阈值
2:表示记录所有的读写操作
2、查询监控结果
db.system.profile.find().sort({millis:-1}).limit(3)
3、分析慢速查询
executionStats.executionTimeMillis = 796 //该query的整体查询时间。
executionStats.executionStages.executionTimeMillisEstimate = 568 //该查询检索document获得数据的时间。
executionStats.executionStages.inputStage.executionTimeMillisEstimate = 226 //该查询扫描⽂档 index所⽤时间。
这三个值越少越好。
nReturned=totalKeysExamined= totalDocsExamined=99999,分别代表该条查询返回的条⽬、索引扫描条⽬、⽂档扫描条⽬,三者一致。
stage组合:Fetch+IXSCAN,根据索引去检索指定document。
从以上数据看,查询出于理想状态。
如以上数据不太理想,可以考虑应⽤程序设计不合理、不正确的数据模型、硬件配置问题,缺少索引等。
4、解读explain结果确定是否缺少索引
看以上查询执行计划,使用了全表烧苗,没有使用索引,可以添加price的索引优化该查询。