MongoDB 的索引到底是使用 B+ 树还是 B 树

摘要:
首先,根据官方网站,它是一棵B树。然而,作者读过一篇文章:云栖社区MongoDB为什么使用B树而不是B+树?,下面的答案实际上是一棵B+树。2018年元旦,我在北京的MongoDB特别会议上询问了WiredTiger引擎的作者,他确认这是一个BplusTree。虽然官方文件已经写了B树。现在我感到困惑。如果有人知道,请留言告诉我。由于第二点,很难找到相关证据。让我们使用官方网站的声明,即我们应该使用B树。所以

先上结论,根据官网的说法是 B 树

MongoDB 的索引到底是使用 B+ 树还是 B 树第1张

然而笔者看到一篇,云栖社区-MongoDB 为什么使用B-树而不是B+树?,里面有人如下回答

实际是B+树,这个在2018年元旦北京的MongoDB专场,我问了WiredTiger引擎的作者,他也确认了是B plus Tree。虽然官方文档写了B树。

现在有些觉得迷惑了,要是有人知道,请留言告诉我好么。

由于第二个观点,相关的佐证很难找,姑且还是采用官网的的说法是用 B 树吧。

那么为什么是 B 树?

在上一篇 MySQL 的索引实现 里笔者分析过

B+ 是在 B 树上改进,它的数据都在叶子节点,同时叶子节点之间还加了指针形成链表。范围选择只需要找到首尾,通过链表就能把所有数据取出来了。

而 B 树有啥好处呢?因此查询单条数据的时候,B树的查询效率不固定,最好的情况是 O(1),因为它不需要再遍历去找到叶子节点。所以可以认为在做单一数据查询的时候,使用 B 树平均性能更好。但是,由于 B 树中各节点之间没有指针相邻,因此 B 树做一些数据遍历操作不那么适合。

换言之 MySQL 之所以选择 B+,那是因为出于范围选择考虑的。那么 MongoDB 选择 B 树,可能是因为单一数据查询多,范围查询少。

那为什么 Mongodb 范围查询少呢?是因为 Mysql 是关系型数据库,而 Mongodb 是非关系型数据。往下看举例

例子

下文图片和例子都出自博客园-孤独烟 为什么Mongodb索引用B树,而Mysql用B+树?

设计学生和班级一对多关系的表。关系型数据库逻辑如下

MongoDB 的索引到底是使用 B+ 树还是 B 树第2张

此时要查 cname 为 1 班的班级,不论是 join,还是先查出所有 cid,后再 student 表里匹配这 cid 相同的记录,都避免不了从一个表中取一个数据,去另一个表中逐行匹配,如果索引结构是 B+ 树,叶子节点上是有指针的,能够极大的提高这种一行一行的匹配速度。

那非关系型怎么设计?

MongoDB 的索引到底是使用 B+ 树还是 B 树第3张

然后再执行两条查询去计算结果,虽然是可以这么设计,但是 MongoDB 并不推荐。发挥非关系型数据库的长处应当这么设计:

MongoDB 的索引到底是使用 B+ 树还是 B 树第4张

假设name这列,我们建了索引!寻执行一次语句,这样就能查询出自己想要的结果。

db.class.find( { name: '1班' } )

而这,就是一种单一数据查询!毕竟你不需要去逐行匹配,不涉及遍历操作,幸运的情况下,有可能一次IO就能够得到你想要的结果。

因此,由于关系型数据库和非关系型数据的设计方式上的不同。导致在关系型数据中,遍历操作比较常见,因此采用B+树作为索引,比较合适。而在非关系型数据库中,单一查询比较常见,因此采用B树作为索引,比较合适。

参考

MongoDB 官方文档-索引

MySQL 的索引实现

云栖社区-MongoDB 为什么使用B-树而不是B+树?

博客园-孤独烟 为什么Mongodb索引用B树,而Mysql用B+树?

免责声明:文章转载自《MongoDB 的索引到底是使用 B+ 树还是 B 树》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SDK的制作详解Centos7 ping 未知的名称或服务 DNS 配置问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mongoDB在windows下安装与配置方案

首先在官网下载mongoDB的安装包: https://www.mongodb.org/downloads 百度云盘下载:http://pan.baidu.com/s/1slUSGYp (安装版 windows64位) 注意:根据自己电脑系统下载相应版本 下载完选择(自定义或默认安装),安装文件后: 在D盘中选择建立文件夹命名为 mongonD 在...

[Mongo] 解决mongoose不支持条件操作符 $gt$gte:$lte$ne $in $all $not

reference : http://blog.sina.com.cn/s/blog_4df23d840100u25x.html 找到mongoose的安装目录 /usr/local/lib/node/mongoose/lib/mongoose/schema 下的文件:string.js 修改SchemaString.prototype.$conditio...

mongo部署(linux)

Linux版本:CentOS release 6.9 Mongodb版本:mongodb-linux-x86_64-3.6.1.tgz 1、解压文件 执行解压命令:tar -zxvf mongodb-linux-x86_64-3.6.1.tgz   2、创建数据,日志目录 命令:mkdir /my/mydata/mongodb       mkdir /m...

美团开源 SQL 优化工具 SQLAdvisor

https://www.oschina.net/news/82725/sqladvisor-opensource https://github.com/Meituan-Dianping/SQLAdvisor SQLAdvisor 是由美团点评公司北京 DBA 团队开发维护的 SQL 优化工具:输入SQL,输出索引优化建议,现已开源。 它基于 MySQL 原...

mongodb的备份还原

一:备份数据库 G:Program FilesMongoDBServer3.0in>mongodump -d mydb -o g:/data/back mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件存在路径 如果没有用户,可以去掉-u和-p。如果导出本机的数据库,可以去掉-h。如果是默认端口,可...

MySQL索引及使用详解

一.索引的作用        一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重。        在数据量和访问量不大的情况下,mysql访问是非常快的,是否加索引对访问影响不大。但是当数据量和访问量剧增的时候,就会发现mysql变慢...