InnoDB中的索引类型?
InnoDB存储引擎支持两种常见的索引数据结构:B+树索引、Hash索引,其中B+树索引是目前关系型数据库系统中最常见、最有效的索引。
数据库中的B+树索引分为聚集索引和非聚集索引。聚集索引就是按照每张表的主键构造一个B+树,B+树的叶子节点中记录着表中一行记录的所有值。只要找到这个叶子节点也就得到了这条记录的所有值。非聚簇索引的叶节点中不包含行记录的所有值。只包含索引值和主键的值。
根据索引的唯一性,有可以把索引分为唯一索引和普通索引。唯一索引要求索引的列值必须唯一,不能重复。
另外,在MySQL 5.6中还增加了全文索引,5.7版本之后通过使用ngram插件开始支持中文。
InnoDB为什么使用B+树实现索引?
首先看看B+树有哪些特点:
- B+树是一棵平衡树,每个叶子节点到根节点的路径长度相同,查找效率较高;
- B+树的所有关键字都在叶子节点上,因此范围查询时只需要遍历一遍叶子节点即可;
- B+树的叶子节点都按照关键字大小顺序存放,因此可以快速地支持按照关键字大小进行排序;
- B+树的非叶子节点不存储实际数据,因此可以存储更多的索引数据;
- B+树的非叶子节点使用指针连接子节点,因此可以快速地支持范围查询和倒序查询。
- B+树的叶子节点之间通过双向链表链接,方便进行范围查询。
那么,使用B+树实现索引,就有以下几个优点:
- 支持范围查询,B+树在进行范围查找时,只需要从根节点一直遍历到叶子节点,因为数据都存储在叶子节点上,而且叶子节点之间有指针连接,可以很方便地进行范围查找。
- 支持排序,B+树的叶子节点按照关键字顺序存储,可以快速支持排序操作,提高排序效率;
- 存储更多的索引数据,因为它的非叶子节点只存储索引关键字,不存储实际数据,因此可以存储更多的索引数据;
- 在节点分裂和合并时,IO操作少。B+树的叶子节点的大小是固定的,而且节点的大小一般都会设置为一页的大小,这就使得节点分裂和合并时,IO操作很少,只需读取和写入一页。
- 有利于磁盘预读。由于B+树的节点大小是固定的,因此可以很好地利用磁盘预读特性,一次性读取多个节点到内存中,这样可以减少IO操作次数,提高查询效率。
- 有利于缓存。B+树的非叶子节点只存储指向子节点的指针,而不存储数据,这样可以使得缓存能够容纳更多的索引数据,从而提高缓存的命中率,加快查询速度。