当前位置: 首页 > 科技观察

为什么MongoDB索引选择B-tree,而MySQL选择B+树(能力总结)

时间:2023-03-19 23:36:07 科技观察

这个问题我老师在看视频的时候就提到了。虽然之前知道他们各自的索引结构,但是还没有去研究原因。网上有很多答案。但是它们都非常冗长。所以本文到此结束。1、B-tree和B+树的区别很明显。要想搞清楚原因,就需要知道B-tree和B+树的区别。为了不长篇大论。我们直接给出他们的形式来概括他们的特点。1.B-treeB-tree是一种自平衡搜索树,形式很简单:thisisaB-tree。我们问题的核心特征如下:(1)多路,非二叉树(2)每个节点都保存索引和数据(3)搜索等价于二分搜索这里假设我们已经了解B树-相关结构。2.B+树B+树是B-tree的变种。核心特征如下:(1)多路非二进制(2)只有叶子节点存储数据(3)搜索等同于二分查找(4)相邻节点的指向指针。从上面我们可以看出核心的区别有两个,一个是数据的存储位置,一个是相邻节点的方向。正是这两个造成了MongoDB和Mysql的区别。为什么?3、B树和B+树的区别(1)B+树查询时间复杂度固定为logn,B树查询复杂度最好为O(1)。(2)B+树的相邻节点的指针可以大大增加区间的可达性,可以用于范围查询等,而B树的每个节点的key和data在一起,区间无法执行搜索。(3)B+树更适合外存,即磁盘存储。由于内部节点没有数据字段,每个节点可以索引更大更精确的范围(4)注意这个区别很重要,它是基于(1)(2)(3),每个节点的B-tree保存数据和保存索引,所以磁盘IO次数很少。只保存了B+树的叶子节点,磁盘IO较多,但是区间访问比较好。既然我们有了他们的分歧,我们最好解释一下原因。2.原因解释要解释原因,还要了解MongoDB和Mysql的基本概念。1、MongoDBMongoDB是文档型数据库,是nosql的一种,使用类Json格式保存数据。比如我们之前的表可能有用户表、订单表、购物篮表等,我们需要在它们之间建立外键关联。但是类Json是不同的。我们可以看到这种形式更加简单易懂。那么为什么MongoDB使用B树呢?MongoDB使用的是B树,所有节点都有一个Data字段,只要找到指定的索引就可以访问。毫无疑问,单次查询平均比Mysql快。2、MysqlMysql作为关系型数据库,具有非常强的数据关联性。间隔访问是一种常见的情况。B+树的数据全部存储在叶子节点中,通过指针链接在一起,因此很容易进行Range遍历甚至全遍历。如果能理解B-tree和B+树的区别,这两个区别的核心就很容易理解了。