B+ 树是为磁盘设计的 m 叉平衡查找树,在B+树中,所有的记录都是按照键值的大小,顺序存放在同一层的叶子节点上,各叶子节点组成双链表。叶节点是数据,非叶节点是索引。
首先,需要清楚:B+ 树索引并不能定位到给定键值的具体行,B+树索引只能找到数据行所在的页。然后,数据库把页读入内存,在内存中查找所需要的行。
B+树索引在数据库中有一个特点是高扇出性,在数据库中,B+树的高度一般都在2 ~ 4层,即查找某一键值的行记录只需要2到4次的IO。数据库的B+树索引分为聚集索引和辅助索引,不管是聚集还是辅助的,其数据结构都是 B+ 树。聚集索引和辅助索引不同的是,叶子节点存放的是否是一整行信息。
聚集索引,就是按照每张表的主键构造一棵 B+ 树,叶节点中存放的是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。聚集索引的节点分为叶节点和非叶节点,叶节点中存放完整的行数据,而非叶节点中存放键值和叶节点的偏移量。
聚集索引对于主键的排序查找和范围查找速度非常快。如用户需要查询一张注册用户的表,查询最后注册的 10 位用户,由于 B+ 树索引是双向链表的,用户可以快速找到最后一个数据页,并取出 10 条数据。对于范围查询,如果要查询主键某一范围内的数据,通过索引节点可以得到数据页的范围,之后读取数据页即可。
辅助索引,叶节点并不包含行记录的全部数据。叶节点中除了包含键值以外,每个页节点的索引行还包含一个书签。该书签用来告诉 InnoDB 存储引擎,哪里可以找到与索引相对应的行数据。这么理解吧:对于给定的辅助索引键值,定位到辅助索引行,得到该行主键,然后通过主键,去查找聚集索引,得到完整的行数据,即要遍历 2 棵 B+ 树。