一、InnoDB存储引擎索引概述
InnoDB存储引擎支持以下几种常见的索引:
- B+ 树索引
- 全文索引
- 哈希索引
B+树索引并不能找到一个给定键值的具体行。B+树索引能找到的只是被查找数据行所在的页,然后在数据库通过把页读入到内存,再在内存中进行查找,最后得到要查找的数据。
二、B+树
- B+树是为磁盘或其他直接存取辅助设备设计的一种平衡查找树,所有记录节点都是按键值的大小顺序存放在同一层的叶子节点上,由各叶子节点指针进行连接。
关于B+树的详细介绍请看此文:B树和B+树详细介绍 - 不管怎么变化,B+树总是会保持平衡,但是为了保持平衡,对于新插入的键值可能需要做大量的拆分页的操作。因为B+树的结构主要用于磁盘,页的拆分意味着磁盘的操作,所以应该在可能的情况下尽量减少页的拆分操作。因此B+树提出了类似于平衡二叉树的旋转功能。旋转发生在 leaf page 已经满,但是其左右兄弟节点没有满的情况下。这时B+树并不会急于去拆分页的操作,而是将记录移到所在页的兄弟节点上。
三、B+树索引
在数据库中,B+树的高度一般在 2~4 层,查找某一键值的行记录时最多只需要2到4次IO。
数据库中的B+树索引可以分为聚集索引和辅助索引。
1、聚集索引
- 聚集索引按每张表的主键构建一棵B+树,同时叶子节点存放的即为整张表的记录数据,页将聚集索引的叶子节点称为数据页,数据也是索引的一部分,每个数据页都用一个双链表进行链接。每张表只有一个具聚集索引。
- 在多数情况下,查询优化器倾向于使用聚集索引,能够快速的发现某一段范围的数据页需要扫描。
- 聚集索引对主键的排序查找和范围查找速度非常快。叶子节点的数据就是用户所要查询的数据。
2、非聚集索引(辅助索引)
- 辅助索引叶子节点不包括行记录的全部数据。叶子节点除了包含键值,还包含了相应数据的聚集索引键。
- 当通过辅助索引来查找数据时,InnoDB存储引擎会遍历辅助索引并通过叶级别的指针获得指向主键索引的主键,然后通过主键索引来找到一个完整的行记录。