MongoDB索引Index应用之explain()方法
与MySQL(参考)一样,MongoDB也提供explain命令对索引进行分析。那如何使用MongoDB中的explain命令呢?下面进行实践:
与MySQL中explain实践(参考)类似循环插?100万条数据(使用JS),不使?索引字段查询查看执?计划 ,然后给某个字段建?索引,使?索引字段作为查询条件再查看执?计划进?分析。
插入200万条数据——与MySQL一样,想着MongoDB是不是也提供存储过程功能,确实提供了只是利用了JS。本以为可以参考在mongodb服务器上存储和执行 js 函数 - 存储过程 - 知乎 (zhihu.com)写存储过程insert100万条数据,但是存储过程的调用eval在MongoDB4.2以后版本就完全弃用了——官方的建议是使用事务取而代之,可以看到官网中提供的Database Command已经没有了evalDatabase Commands — MongoDB Manual,那就采取另外一种方式吧。如下:
为后续查询分析准备不再使用默认_id,使用自定义_id,可以参考MongoDB 自动增长 | 菜鸟教程 (runoob.com)。
getNextSequence方法是通过db.system.js.insert直接放在system.js表中的。为什么是这个表而不是其他的呢?因为这个表是专门用来保存js函数的。如果定义完函数退出mongo实例,会发现还是无法使用函数getNextSequence。这是因为虽然定义了函数但是没有把函数引入仍然无法使用,也就是说每次重新进入mongo的实例后需要把相应的js函数重新导入一遍。通过,db.loadServerScripts();把system.js中的函数,引入到mongo实例
下面示范explain的使用:
从上图可知explain()可以接收不同的参数,通过设置不同参数我们可以查看更详细的查询计划,分别如下:
1、queryPlanner: queryPlanner是默认参数。
2、executionStats: executionStats会返回执?计划的?些统计信息(有些版本中和allPlansExecution等同)。
3、allPlansExecution:allPlansExecution?来获取所有执?计划,结果参数基本与上?相同。其是以上两个参数的拼接。