一言以蔽之-MySQL 的树

100 阅读2分钟

B 树

B 树是平衡多路查找树。

以 3 阶 B 树为例:

B.jpg

每个节点占用一个盘块的磁盘空间,一个节点上有两个升序排序的关键字和三个指向子树根节点的指针,指针存储的是子节点所在磁盘块的地址。两个关键词划分成的三个范围域对应三个指针指向的子树的数据的范围域。

B+ 树

B+树是在 B 树基础上做的优化。

B 树的每个节点中不仅包含数据的key值,还有data值。而每一个页的存储空间是有限的,如果data数据较大时将会导致每个节点(即一个页)能存储的key的数量很小,当存储的数据量很大时同样会导致B-Tree的层级较大,增大查询时的磁盘I/O次数,进而影响查询效率。

在B+Tree中,所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储key值信息,这样可以大大加大每个节点存储的key值数量,降低B+Tree的高度。

B+Tree相对于B-Tree有几点不同:

  • 非叶子节点只存储键值信息
  • 所有叶子节点之间都有一个链指针
  • 数据记录都存放在叶子节点中

b+.jpg

节点就是图中的磁盘块,也就是1 页,每个节点大小 16k 即可满足需求。

Innodb 中,B+树中的一个节点存储的内容是:

  • 非叶子节点:key + 指针
  • 叶子节点:key + data + 链指针

对于叶子节点:我们假设 1 行数据大小为 1k(对于普通业务绝对够了),那么 1 页能存 16 条数据。

对于非叶子节点:key 使用 bigint 则为 8 字节,指针在 MySQL 中为 6 字节,一共是 14 字节,则 16k 能存放 16 * 1024/ 14 = 1170 个。

那么一颗高度为 3 的 B+树能存储的数据为:1170 * 1170 * 16 = 21902400(千万级)。

所以在 InnoDB 中 B+树高度一般为 3 层时,就能满足千万级的数据存储。

在查找数据时一次页的查找代表一次 IO,所以通过主键索引查询通常只需要 1-3 次 IO 操作即可查找到数据。千万级别对于一般的业务来说已经足够了。


如果觉得有帮助,就请点个赞鼓励一下吧。

3.png