MySQL 中的许多概念在 MongoDB 中具有相近的类比。下表是一些常见概念:
MySQL MongoDB
库 Database 库 Database
表 Table 集合 Collection
行 Row 文档 Document
列 Column 字段 Field
joins 嵌入文档或者链接
1、B-树
其中 B 是 balance( 平衡的意思)的缩写,B-树是一种多路自平衡的搜索树 。它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点。它实现了以 O(lgn) 时间复杂度执行查找、顺序读取、插入和删除操作。由于 B 树和 B 树的变种在降低磁盘 I/O 操作次数方面表现优异,所以经常用于设计文件系统和数据库。
对于m阶B树的特征如下:
树中每个节点最多含有m个孩子(m>=2)。
除根节点和叶子节点之外,其他每个节点至少含有[ceil(m/2)]个孩子。
若根节点不是叶子节点,则至少含有2个孩子。
所有叶子节点都出现在同一层,叶子节点不包含任何关键字信息(可看做是外部节点或查询失败的节点,实际上这些节点是不存在的,指向这些节点的指针为null)。
有j个孩子的非叶子节点恰好含有j-1个关键字,关键字按照递增的顺序排列。
2、B+树
B+树是为磁盘及其他存储辅助设备而设计一种平衡查找树(不是二叉树)。B+树中,所有记录的节点按大小顺序存放在同一层的叶节点中,各叶节点用指针进行连接。
数据库中B+树索引分为聚集索引(clustered index)和非聚集索引(secondary index).这两种索引的共同点是内部都是B+树,高度都是平衡的,叶节点存放着所有数据。不同点是叶节点是否存放着一整行数据。
B+树的特点如下:
除根节点之外的内部节点,每个节点最多含有m个关键字,至少含有m/2个关键字,其中,每个关键字对应一个孩子子树。
根节点要么没有子树,要么至少含有2个子树
所有的叶子节点包含了所有的关键字,以及这些关键字指向文件的指针,并且:
① 所有叶子节点中的关键字按照从小到大的顺序排列。
② 相邻的叶子节点顺序连接(相当于构成了一个顺序链表)。
③ 所有叶子节点在同一层。
所有的分支节点的关键字都是对应子树中关键字的最大值。
B-树和B+树最重要的一个区别就是B+树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域。
3、MongoDB 为什么使用B-树?
B+树内节点不存储数据,所有 data 存储在叶节点导致查询时间复杂度固定为 log n。而B-树查询时间复杂度不固定,与 key 在树中的位置有关,最好为O(1)
我们说过,尽可能少的磁盘 IO 是提高性能的有效手段。MongoDB 是聚合型数据库,而 B-树恰好 key 和 data 域聚合在一起。
至于MongoDB为什么使用B-树而不是B+树,可以从它的设计角度来考虑,它并不是传统的关系性数据库,而是以Json格式作为存储的nosql,目的就是高性能,高可用,易扩展。首先它摆脱了关系模型,上面所述的优点2需求就没那么强烈了,其次Mysql由于使用B+树,数据都在叶节点上,每次查询都需要访问到叶节点,而MongoDB使用B-树,所有节点都有Data域,只要找到指定索引就可以进行访问,无疑单次查询平均快于Mysql。
4、为什么 Mysql 使用B+树
Mysql 是一种关系型数据库,区间访问是常见的一种情况,而 B-树并不支持区间访问,而B+树由于数据全部存储在叶子节点,并且通过指针串在一起,这样就很容易的进行区间遍历甚至全部遍历。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。