第 6章-快速查询的秘籍——B+树索引

InnoDB中,新分配的数据页编号可能并不是连续的,这些页在磁盘上可能并不挨着。它们只是通过维护上一页和下一页的编号而建立了链表关系。

在对页中的记录进行增删改操作的过程中,我们必须通过一些诸如记录移动的操作来始终保证这个状态一直成立:下一个数据页中用户记录的主键值必须大于上一个页中用户记录的主键值。这个过程也可以成为页分裂。

InnoDB中的索引方案 #

记录头信息中的record_type的值意义:

  • 0:普通记录。
  • 1:目录项记录。
  • 2:最小记录-Infimum。
  • 3:最大记录-Supremum。

一个B+树的节点可以分成好多层。InnoDB规定最下面的那层为第0层,之后层级依次往上加。

一般情况下,我们用到的B+树都不会超过4层。

聚簇索引有两个特点:

  • 使用记录主键值的大小进行记录和页的排序:
    • 页内的记录按照主键的大小顺序排成一个单向链表。
    • 各个存放用户记录的页也是根据页中用户记录的主键大小顺序排成一个双向链表。
    • 存放目录项记录的页分为不同层级,在同一层级中的页也是根据页中目录项记录的主键大小顺序排成一个双向链表。
  • B+树的叶子节点存储的是完整的用户记录。

二级索引与聚簇索引有几处不同:

  • 使用索引列的大小进行记录和页的排序:
    • 页内的记录按照索引列的大小顺序排成一个单向链表。
    • 各个存放用户记录的页也是根据页中记录的索引列大小顺序排成一个双向链表。
    • 存放目录项记录的页分为不同层级,在同一层级中的页也是根据页中目录项记录的索引列大小顺序排成一个双向链表。
  • B+树的叶子结点存储的并不是完整的用户记录,而只是索引列+主键的值。
  • 目录项记录中不再是主键+页号的搭配,而变成了索引列+页号的搭配。(实际上是索引列+主键的值+页号的搭配)

联合索引: 以多个列的大小为排序规则建立的B+树成为联合索引,也称为复合索引或多列索引。

InnoDB中B+树索引的注意事项 #

一个B+树索引的根节点自创建之日起便不会再移动(也就是页号不会再改变)。

为了让新插入的记录能找到自己在哪个页中,需要保证B+树中同一层内节点的目录项记录除页号这个字段以外是唯一的。索引二级索引内节点的目录项记录实际上由3部分构成:

  • 索引列的值。
  • 主键值。
  • 页号。

对于二级索引记录来说,是先按照二级索引列的值进行排序,在二级索引列值相同的情况下,再按照主键值进行排序。

唯一二级索引的内节点的目录项也会包含记录的主键值。

一个页面至少容纳2条记录: InnoDB为了避免B+树的层级增长得过高,而要求所有数据页都至少可以容纳2条记录。

MyISAM的索引方案 #

MyISAM将索引和数据分开存储。”索引是索引,数据是数据“。

创建和删除索引的语句 #

  • 添加索引:
alter table 表名 add index 索引名(列名);
  • 添加唯一索引:
alter table 表名 add unique index 索引名(列名);
  • 删除索引:
alter table 表名 drop index 索引名;