InnoDB为什么采用B+树作为索引模型

简介: InnoDB为什么采用B+树作为索引模型

1. 二叉查找树

  1. 从算法逻辑上考虑,二叉查找树的查找速度和比较次数都是最小的。但需要考虑磁盘IO。

  2. 数据库索引是存储在磁盘上的,当数据量比较大的时候,索引的大小可能有几个G甚至更多。当利用索引查询的时候,不可能把整个索引全部加载到内存,只能逐一加载每一个磁盘页,磁盘页对应着索引树的节点。
  3. 假如使用二叉树作为索引结构,假设树的高度为4,需要查找的值为10。流程如下:


1.第一次磁盘IO:


  1. 第二次磁盘IO:
  2. 第三次磁盘IO:
  3. 第四次磁盘IO:
  1. 可以看到最坏的情况下,磁盘IO次数等于索引树的高度。为了减少磁盘IO的次数,就要把原本”瘦高“的树变得”矮胖“。这就是B树的特征之一。

2. B树

1.B树是一种多路平衡查找树,每个节点最多包含k个孩子,k被称为B树的阶。k的大小取决于磁盘页的大小。

2.一个m阶的B树具有如下几个特征:

  1. 根结点至少有两个子节点;
  2. 每个中间节点都包含k-1个元素和k个子节点,其中 m/2 <= k <= m;
  3. 每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m;
  4. 所有的叶子结点都位于同一层;
  5. 每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个子节点包含的元素的值域分划;

3.B树的比较次数不比二叉树少(尤其是一个节点中元素很多的时候),但它的磁盘IO次数减少了,相比磁盘IO的速度,内存中的比较耗时几乎可以忽略。所以只要树的高度足够低,磁盘IO次数足够少,就能提高性能。

4.B树的插入和删除过程还是比较复杂的。

5.B树主要应用于文件系统以及部分数据库索引。比如非关系型数据库MongoDB。而大部分关系型数据库,如MySQL,则使用B+树作为索引。


3. B+树

3.1. B+树特征

  1. B+树和B树有一些共同点,但B+树也具备一些新的特征。
  2. 一个m阶的B+树具有如下几个特征:
  3. 有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点;
  4. 所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接;
  5. 所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素;
  6. B+树节点之间含有重复元素(每个父节点的元素都出现在子节点中,是子节点最大或最小的元素),而且叶子节点之间还用指针连在一起。
  7. 因此,根节点的最大元素(比如15)是整个B+树的最大元素。所以无论插入或删除元素的时候,都要保持最大元素在根节点中。
  8. 叶子节点包含了全量元素信息,并且每一个叶子节点都带有指向下一个节点的指针,形成一个有序链表。
  9. B+树还有一个特点,就是“卫星数据”的位置。所谓卫星数据,指的是索引元素指向的数据记录,比如数据库中的某一行。
  10. B树中,无论是中间节点还是叶子节点都带有卫星数据;
  11. B+树中,只有叶子节点带有卫星数据,中间节点只是索引,与数据没有关联;
  12. 在数据库的聚簇索引(Clustered Index)中,叶子节点直接包含卫星数据。在非聚簇索引(Non-Clustered Index)中,叶子节点带有指向卫星数据的指针。
  13. B+树相对于B树的优点体现在查询性能上:单行查询、范围查询。


3.2. 单行查询

  1. B+树的中间节点没有卫星数据,所以同样大小的磁盘页能容纳更多节点元素,数据量相同的情况下,B+树更“矮胖”,因此磁盘IO次数更少
  2. B+树必须查找到叶子节点,因为数据在叶子节点上。而B树只要匹配到节点即可,不论是中间节点还是叶子节点。因此,B+树比B树的查找性能更稳定


3.3. 范围查询

  1. B树的范围查询:先自顶向下找到范围的下限,然后中序遍历,比较繁琐。
  2. B+树的范围查询:先自顶向下找到范围的下限,然后遍历链表即可,范围查询十分方便
目录
相关文章
|
3月前
|
存储 算法 关系型数据库
深入理解InnoDB索引数据结构和算法
1. **索引定义**:索引是提升查询速度的有序数据结构,帮助数据库系统快速找到数据。 2. **索引类型**:包括普通索引、唯一索引、主键索引、空间索引和全文索引,每种有特定应用场景。 3. **数据结构**:InnoDB使用B+树作为索引结构,确保所有节点按顺序排列,降低查询时的磁盘I/O。 4. **B+树特性**:所有数据都在叶子节点,非叶子节点仅存储索引,提供高效范围查询。 5. **索引优势**:通过减少查找数据所需的磁盘I/O次数,显著提高查询性能。 **总结:**InnoDB索引通过B+树结构,优化了数据访问,使得查询速度快,尤其适合大数据量的场景。
129 0
深入理解InnoDB索引数据结构和算法
|
3月前
|
存储 关系型数据库 MySQL
索引大战:探秘InnoDB数据库中B树和Hash索引的优劣
索引大战:探秘InnoDB数据库中B树和Hash索引的优劣
35 0
|
3月前
|
存储 SQL 关系型数据库
系统设计场景题—MySQL使用InnoDB,通过二级索引查第K大的数,时间复杂度是多少?
系统设计场景题—MySQL使用InnoDB,通过二级索引查第K大的数,时间复杂度是多少?
68 1
系统设计场景题—MySQL使用InnoDB,通过二级索引查第K大的数,时间复杂度是多少?
|
3月前
|
存储 算法 关系型数据库
InnoDb行格式、数据页结构、索引底层原理和如何建立索引
InnoDb行格式、数据页结构、索引底层原理和如何建立索引
87 0
|
11月前
|
存储 关系型数据库 MySQL
6.2.2 【MySQL】InnoDB中的索引方案
6.2.2 【MySQL】InnoDB中的索引方案
45 0
|
11月前
|
SQL 关系型数据库 MySQL
【Mysql-InnoDB 系列】事务模型
提到事务,大家都有基本的了解,例如mysql的事务隔离级别包括:读未提交、读已提交、可重复读、串行化;InnoDB默认是RR(可重复读);基本的MVCC等等。但大部分人对深入一些的原理就知之甚少了。本文整理事务模型的相关内容,仅供参考。
114 0
|
11月前
|
存储 关系型数据库 MySQL
6.2.3 【MySQL】InnoDB的B+树索引的注意事项
6.2.3 【MySQL】InnoDB的B+树索引的注意事项
69 0
|
2月前
|
关系型数据库 MySQL 调度
深入理解MySQL InnoDB线程模型
深入理解MySQL InnoDB线程模型
|
2月前
|
存储 关系型数据库 MySQL
【MySQL技术内幕】5.1-InnoDB存储引擎索引概述
【MySQL技术内幕】5.1-InnoDB存储引擎索引概述
37 0
|
3月前
|
SQL 存储 关系型数据库
【深入浅出MySQL】「底层原理」InnoDB索引原理全程实操指南,带你从入门到精通
【深入浅出MySQL】「底层原理」InnoDB索引原理全程实操指南,带你从入门到精通
107 1