上一篇聊到了索引类型和索引属性,今天来聊聊索引的性能分析
首先说说索引的分析工具explain,我常用的工具是MongoDB compass,在explain标签页就可以得到分析内容
![](https://img.haomeiwen.com/i20730097/46ccf0924509bdb2.png)
其中返回结果有三种
queryPlanner,executionStats,allPlansExecution
[https://blog.csdn.net/u014231523/article/details/103437913]
具体可以看,写的很详细(https://blog.csdn.net/u014231523/article/details/103437913)
![](https://img.haomeiwen.com/i20730097/30daff655cb7c769.png)
结果输出主要查看的几个点有stage(执行状态),nReturned(返回文档数),totalKeysExamined(索引扫描文档数,为0未使用索引),totalDocsExamined(扫描文档数)
executionTimeMillis(执行时间)
https://docs.mongodb.com/manual/reference/explain-results/
执行计划的返回结果中尽量不要出现以下stage:
COLLSCAN(全表扫描)
SORT(使用sort但是无index)
不合理的SKIP
SUBPLA(未用到index的$or)
COUNTSCAN(不使用index进行count)
如果一个查询涉及到两个索引,mongo是怎么判断选哪一个?
![](https://img.haomeiwen.com/i20730097/827a3436e3ee20f1.png)
索引交集和复合索引的区别
MongoDB可以使用多个索引的交集来完成查询,一个文档的查询涉及到多个索引
![](https://img.haomeiwen.com/i20730097/271b561f1b74a0ba.png)
是否用上索引交集可以看看explain的索引状态是否为AND_SORTED或AND_HASH
由于复合索引之前说过有最左匹配原则
{ status: 1, ord_date: -1 }当前索引无法用于
db.orders.find( { ord_date: { $gt: new Date("2014-02-01") } } )
db.orders.find( { } ).sort( { ord_date: 1 } )
但如果拆成两个索引不仅交集可以用上,以上两个查询也可以用上
当然复合索引(覆盖索引)对不用回表的情况,而且排序的性能支持的比较好,若是该表数据量太大,且需要多种索引使用情况,可以考虑用索引交集代替覆盖索引
https://docs.mongodb.com/manual/core/index-intersection/
创建索引是比较昂贵的操作,前台创建的话会阻塞其他操作,可以在后台创建
db.member.createIndex( { city: 1}, {background: true} )
最后补一个知识点,不管是TTL还是mongo的remove操作,和mysql,oracle delete操作一样,磁盘空间并不会被回收,mongo要回收需要执行compact,由于compact会加库级锁,一般这个操作在从库进行
网友评论