✅InnoDB为什么使用B+树实现索引?

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: InnoDB使用B+树实现索引,因其具备平衡特性、所有数据存储在叶子节点利于范围查询和排序,且非叶子节点仅含索引关键字,能存储更多数据,减少IO操作并优化缓存利用率。B+树与哈希索引的区别在于,后者适用于等值查询但不支持范围查询和排序,且磁盘访问效率较低。相比于红黑树和B树,B+树更适合数据库索引需求。

InnoDB为什么使用B+树实现索引?说到这个话题,就需要先聊一聊InnoDB的索引类型有哪些?

InnoDB中的索引类型

InnoDB存储引擎支持两种常见的索引数据结构:B+树索引和哈希索引,其中B+树索引是目前关系型数据库系统中最为常见、最为高效的索引之一。

数据库中的B+树索引可分为聚簇索引和非聚簇索引。聚簇索引按照每张表的主键构建一个B+树,其叶子节点记录着表中每行记录的所有值。只需访问叶子节点即可获取整行记录的信息。非聚簇索引的叶子节点中并不包含完整的行记录信息,而仅包含索引值和对应的主键值。

根据索引的唯一性,索引可分为唯一索引和普通索引。唯一索引要求索引列的值必须唯一,不可重复。

此外,在MySQL 5.6版本中引入了全文索引,在5.7版本及以后,通过使用ngram插件开始支持中文全文搜索。

B+树的特点

首先来看一下B+树的特点:

  1. B+树是一棵平衡树,每个叶子节点到根节点的路径长度相同,从而提高了查找效率;
  2. 所有关键字都存储在B+树的叶子节点上,因此进行范围查询时只需遍历一次叶子节点即可;
  3. 叶子节点按照关键字大小顺序存放,因此能够快速支持按关键字大小进行排序;
  4. 非叶子节点不存储实际数据,这使得可以存储更多的索引数据;
  5. 非叶子节点使用指针连接子节点,从而能够迅速支持范围查询和倒序查询;
  6. 叶子节点之间通过双向链表连接,便于进行范围查询。

image.png

使用B+树实现索引具有以下几个优点:

  1. 支持范围查询:B+树在执行范围查找时,只需从根节点遍历至叶子节点,因为数据存储在叶子节点上,并且叶子节点之间有指针连接,便于进行范围查找。
  2. 支持排序:B+树的叶子节点按关键字顺序存储,能够快速支持排序操作,提升排序效率。
  3. 存储更多的索引数据:由于非叶子节点仅存储索引关键字而不存储实际数据,可容纳更多索引数据。
  4. 减少IO操作:B+树的叶子节点大小固定,一般设置为一页大小,使得节点分裂和合并时的IO操作较少,只需读取和写入一页。
  5. 利用磁盘预读:节点大小固定有利于利用磁盘预读特性,一次性读取多个节点到内存中,减少IO操作次数,提高查询效率。
  6. 优化缓存利用:B+树的非叶子节点仅存储指向子节点的指针,不存储数据,可使缓存容纳更多索引数据,提高缓存命中率,加速查询速度。

为什么不用红黑树或者B树?

因为B+树的特点是只有叶子节点存储数据,而非叶子节点不存储数据,并且节点大小固定,叶子节点之间通过双向链表链接,所以,使用B+树实现索引具有诸多优势,比如支持范围查询、有利于磁盘预读、优化排序等等。而这些是红黑树和B树无法实现的。

B+树索引和Hash索引有什么区别?

B+树索引和哈希索引是常见的数据库索引结构,它们之间存在以下几个主要区别:

B+树索引将索引列的值按大小排序后存储,因此适合范围查找和排序操作;而哈希索引则通过哈希函数计算索引列的值,得到一个桶的编号,然后将桶内记录保存在链表或树结构中。因此,哈希索引适合等值查询,但不适合范围查询和排序操作。

在插入和删除数据时,B+树索引需要调整索引结构,可能涉及页分裂和页合并等操作,因此维护成本较高;而哈希索引只需计算哈希值并操作链表中的记录,维护成本相对较低。

B+树索引在磁盘上有序存储,可利用磁盘预读提高区间查询效率;而哈希索引在磁盘上无序存储,可能需要随机访问磁盘,导致查询效率下降。

由于B+树索引在节点中存储多个键值对,能充分利用磁盘块空间,提高空间利用率;而哈希索引需要额外存储哈希值和指针,空间利用率相对较低。

相关文章
|
1月前
|
存储 算法 关系型数据库
深入理解InnoDB索引数据结构和算法
1. **索引定义**:索引是提升查询速度的有序数据结构,帮助数据库系统快速找到数据。 2. **索引类型**:包括普通索引、唯一索引、主键索引、空间索引和全文索引,每种有特定应用场景。 3. **数据结构**:InnoDB使用B+树作为索引结构,确保所有节点按顺序排列,降低查询时的磁盘I/O。 4. **B+树特性**:所有数据都在叶子节点,非叶子节点仅存储索引,提供高效范围查询。 5. **索引优势**:通过减少查找数据所需的磁盘I/O次数,显著提高查询性能。 **总结:**InnoDB索引通过B+树结构,优化了数据访问,使得查询速度快,尤其适合大数据量的场景。
68 0
深入理解InnoDB索引数据结构和算法
|
1月前
|
存储 关系型数据库 MySQL
索引大战:探秘InnoDB数据库中B树和Hash索引的优劣
索引大战:探秘InnoDB数据库中B树和Hash索引的优劣
25 0
|
1月前
|
存储 SQL 关系型数据库
系统设计场景题—MySQL使用InnoDB,通过二级索引查第K大的数,时间复杂度是多少?
系统设计场景题—MySQL使用InnoDB,通过二级索引查第K大的数,时间复杂度是多少?
60 1
系统设计场景题—MySQL使用InnoDB,通过二级索引查第K大的数,时间复杂度是多少?
|
1月前
|
存储 算法 关系型数据库
InnoDb行格式、数据页结构、索引底层原理和如何建立索引
InnoDb行格式、数据页结构、索引底层原理和如何建立索引
75 0
|
9月前
|
存储 关系型数据库 MySQL
6.2.3 【MySQL】InnoDB的B+树索引的注意事项
6.2.3 【MySQL】InnoDB的B+树索引的注意事项
62 0
|
8天前
|
存储 关系型数据库 MySQL
【MySQL技术内幕】5.1-InnoDB存储引擎索引概述
【MySQL技术内幕】5.1-InnoDB存储引擎索引概述
21 0
|
1月前
|
SQL 算法 关系型数据库
✅Innodb加索引,这个时候会锁表吗?
MySQL 5.6 引入 Online DDL 技术,允许在创建或删除 InnoDB 索引时不阻塞其他会话,减少了锁定和性能影响。不同 DDL 操作支持不同方式,如 COPY、INSTANT 和 INPLACE,具体见官方文档。虽然 Online DDL 可减少阻塞,但可能在索引构建期间仍有锁定,建议在非高峰时段执行并做好测试和规划。MySQL 5.6 之前的 DDL 操作会导致表锁定,而 Online DDL 旨在减少这种阻塞,但并非所有 DDL 语句都适用。了解各种算法如 COPY、INPLACE 和 INSTANT,以及它们的工作原理,有助于优化 DDL 操作。
|
1月前
|
存储 关系型数据库 MySQL
InnoDB中的索引方案
InnoDB中的索引方案
19 0
|
1月前
|
SQL 存储 关系型数据库
【深入浅出MySQL】「底层原理」InnoDB索引原理全程实操指南,带你从入门到精通
【深入浅出MySQL】「底层原理」InnoDB索引原理全程实操指南,带你从入门到精通
62 1
|
1月前
|
存储 关系型数据库 MySQL
mysql 索引的代价(InnoDB)
mysql 索引的代价(InnoDB)