MongoDB学习---MongoDB的执行计划
MongoDB学习—MongoDB的执行计划1.explain()接收不同的参数queryPlanner:queryPlanner是默认参数,具体执行计划信息参考下面的表格。executionStats:executionStats会返回执行计划的一些统计信息(有些版本中和allPlansExecution等同)。allPlansExecution:allPlansExecution用来获取所有执
·
MongoDB学习—MongoDB的执行计划
1.explain()接收不同的参数
queryPlanner
:queryPlanner是默认参数,具体执行计划信息参考下面的表格。
executionStats
:executionStats会返回执行计划的一些统计信息(有些版本中和allPlansExecution等同)。
allPlansExecution
:allPlansExecution用来获取所有执行计划,结果参数基本与上文相同。
2.MongoDB慢查询分析
- 开启内置的查询分析器,记录读写操作效率
db.setProfilingLevel(n,m),n的取值可选0,1,2
0表示不记录
1表示记录慢速操作,如果值为1,m必须赋值单位为ms,用于定义慢速查询时间的阈值
2表示记录所有的读写操作
执行完操作后返回的都是上一次设置的值
- 查询监控结果,
{millis:-1}表示降序
db.system.profile.find().sort({millis:-1}).limit(3) - 分析慢速查询
应用程序设计不合理、不正确的数据模型、硬件配置问题,缺少索引等 - 解读explain结果 确定是否缺少索引
3.MongoDB索引底层实现原理分析
-
MongoDB 是文档型的数据库,它使用BSON 格式保存数据,比关系型数据库存储更方便。
-
比如之前关系型数据库中处理用户、订单等数据要建立对应的表,还要建立它们之间的关联关系。
-
但是BSON就不一样了,我们可以把一条数据和这条数据对应的数据都存入一个BSON对象中,这种形式更简单,通俗易懂。
-
MySql是关系型数据库,数据的关联性是非常强的,区间访问是常见的一种情况,底层索引组织数据使用B+树,B+树由于数据全部存储在叶子节点,并且通过指针串在一起,这样就很容易的进行区间遍历甚至全部遍历。
-
MongoDB使用B-树,所有节点都有Data域,只要找到指定索引就可以进行访问,单次查询从结构上来看要快于MySql。
-
B-树是一种自平衡的搜索树,形式很简单:
-
B-树的特点
:- 多路 非二叉树
- 每个节点 既保存数据 又保存索引
- 搜索时 相当于二分查找
-
B+树是B-树的变种,B+ 树的特点
:- 多路非二叉
- 只有叶子节点保存数据
- 搜索时 也相当于二分查找
- 增加了 相邻节点指针
-
从上面我们可以看出最核心的区别主要有俩,一个是数据的保存位置,一个是相邻节点的指向。就是这俩造成了MongoDB和MySql的差别
。- B+树相邻接点的指针可以大大增加区间访问性,可使用在范围查询等,而B-树每个节点 key 和data 在一起 适合随机读写 ,而区间查找效率很差。
- B+树更适合外部存储,也就是磁盘存储,使用B-结构的话,每次磁盘预读中的很多数据是用不上的数据。因此,它没能利用好磁盘预读的提供的数据。由于节点内无 data 域,每个节点能索引的范围更大更精确。
- 注意这个区别相当重要,是基于
1
和2
的,B-树每个节点即保存数据又保存索引 树的深度小,所以磁盘IO的次数很少,B+树只有叶子节点保存,较B树而言深度大磁盘IO多,但是区间访问比较好。
更多推荐
已为社区贡献2条内容
所有评论(0)