Mongodb索引使用B树,而MySQL使用B+树。那么这两者的区别是什么?
注意:这里的Mysql指的是Innodb的存储引擎下的索引结构,其他存储引擎暂不考虑。
1、B+树的特点
1)数据只出现在叶子节点
2)所有叶子节点增加了一个链指针
2、B树的特点
1)树内的每个节点都存储数据
2)叶子节点之间无指针相邻
3、Mongodb与MySQL索引的区别
可以从两个角度来看
1)数据结构
B树和B+树最重要的一个区别就是B+树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域。这就决定了B+树更适合外部存储,也就是磁盘存储。
B+树所有的Data域都在叶子节点,一般来说都会进行一个优化,就是将所有的叶子节点用指针串起来。这样遍历叶子节点就能获得全部数据,这样就能进行区间访问啦。
2)设计角度
mongodb并不是传统的关系性数据库,而是以Bson(Binary-JSON)格式作为存储的nosql,目的就是高性能,高可用,易扩展。首先它摆脱了关系模型,对于区间访问的需求就没那么强烈了。
其次Mysql由于使用B+树,数据都在叶节点上,每次查询都需要访问到叶节点,而MongoDB使用B树,所有节点都有Data域,只要找到指定索引就可以进行访问,无疑单次查询平均快于Mysql。
4、总结
针对上面的B+树和B树的特点,我们做一个总结
1)B树的树内存储数据,因此查询单条数据的时候,B树的查询效率不固定,最好的情况是O(1)。我们可以认为在做单一数据查询的时候,使用B树平均性能更好。但是,由于B树中各节点之间没有指针相邻,因此B树不适合做一些数据遍历操作。
2)B+树的数据只出现在叶子节点上,因此在查询单条数据的时候,查询速度非常稳定。B+树查询时间复杂度固定是logn,B树查询复杂度最好是 O(1)。因此,在做单一数据的查询上,其平均性能并不如B树。但是,B+树的叶子节点上有指针进行相连,因此在做数据遍历的时候,只需要对叶子节点进行遍历即可,这个特性使得B+树非常适合做范围查询。
因此,我们可以做一个推论:没准是Mysql中数据遍历操作比较多,所以用B+树作为索引结构。而Mongodb是做单一查询比较多,数据遍历操作比较少,所以用B树作为索引结构。
几点疑问
1、那么为什么Mysql做数据遍历操作多?而Mongodb做数据遍历操作少呢?
因为Mysql是关系型数据库,而Mongodb是非关系型数据。
2、那为什么关系型数据库,做数据遍历操作多?而非关系型数据库做数据遍历操作少呢?
结论:
因此,由于关系型数据库和非关系型数据的设计方式上的不同。导致在关系型数据中,遍历操作比较常见,因此采用B+树作为索引,比较合适。而在非关系型数据库中,单一查询比较常见,因此采用B树作为索引,比较合适。
参考链接:https://www.cnblogs.com/rjzheng/p/12316685.html