返回

逐层剥开索引结构,揭开MySQL选用B+树背后的秘密

后端

索引,是数据库系统中必不可少的加速工具,它能够快速地查找数据,减少查询时间。MySQL作为一款备受欢迎的数据库系统,其索引结构的设计尤为引人注目。MySQL索引结构采用B+树,这可不是无缘无故的。

B+树是一种多路搜索树,它具有以下特点:

  • 每个节点包含多个和指针。
  • 所有叶子节点在同一层。
  • 非叶节点的关键字是其子节点关键字的最大值。

这些特点使得B+树非常适合作为索引结构,主要有以下几个原因:

  • 查询速度快: B+树采用多路搜索,一次磁盘IO可以读取多个关键字,查询速度非常快。
  • 插入和删除速度快: B+树的叶子节点是顺序存储的,插入和删除数据时,只需要修改叶子节点,无需修改非叶节点。
  • 空间利用率高: B+树的每个节点都可以存储多个关键字,空间利用率非常高。

MySQL中,索引可以分为聚集索引和非聚集索引。聚集索引是指索引的关键字是表的主键,非聚集索引是指索引的关键字不是表的主键。

聚集索引和非聚集索引的区别在于,聚集索引的叶子节点存储的是整行数据,而非聚集索引的叶子节点只存储的是主键值。

当我们进行查询时,如果使用的是聚集索引,那么只需要访问一次磁盘就可以获得整行数据。如果使用的是非聚集索引,那么需要先访问一次磁盘获取主键值,然后再去访问一次磁盘获取整行数据。

因此,聚集索引的查询速度要比非聚集索引的查询速度快。

在MySQL中,B+树是默认的索引结构。这是因为B+树具有查询速度快、插入和删除速度快、空间利用率高等优点。

在实际应用中,B+树被广泛用于各种数据库系统中,不仅是MySQL,Oracle、SQL Server、PostgreSQL等数据库系统也采用了B+树作为索引结构。

下面,我们以范围查询、等值查询和前缀查询为例,具体展示B+树在MySQL中的实际运作。

范围查询

范围查询是指查询某个范围内的所有数据。例如,我们想查询表中所有年龄在18岁到25岁之间的学生。

使用B+树索引,我们可以通过以下步骤进行查询:

  1. 从根节点开始,找到第一个大于或等于18的关键字。
  2. 沿着这个关键字指向的指针,找到其子节点。
  3. 在子节点中,找到第一个大于或等于25的关键字。
  4. 沿着这个关键字指向的指针,找到其子节点。
  5. 这个子节点就是包含所有年龄在18岁到25岁之间的学生数据的叶子节点。

等值查询

等值查询是指查询某个特定值的数据。例如,我们想查询表中所有年龄为20岁的学生。

使用B+树索引,我们可以通过以下步骤进行查询:

  1. 从根节点开始,找到等于20的关键字。
  2. 沿着这个关键字指向的指针,找到其子节点。
  3. 这个子节点就是包含所有年龄为20岁的学生数据的叶子节点。

前缀查询

前缀查询是指查询某个特定前缀的数据。例如,我们想查询表中所有名字以“张”开头的学生。

使用B+树索引,我们可以通过以下步骤进行查询:

  1. 从根节点开始,找到第一个大于或等于“张”的关键字。
  2. 沿着这个关键字指向的指针,找到其子节点。
  3. 在子节点中,找到第一个大于或等于“张”的关键字。
  4. 沿着这个关键字指向的指针,找到其子节点。
  5. 这个子节点就是包含所有名字以“张”开头的学生数据的叶子节点。

通过上面的例子,我们可以看到,B+树在MySQL中有着非常重要的作用。它可以大幅度提高查询速度,从而提高数据库的整体性能。