文章目录
  1. 聚集索引
  2. 辅助索引
  3. B+树索引的分裂
  4. Cardinality值
  5. B+树中索引的使用

聚集索引

按照每张表的主键构造一棵B+树,叶子节点存放行记录;

可见一张表只能有一个聚集索引。

 

事实上,聚集索引的存储并不是物理连续的,而是逻辑连续的:(1)页通过双向链表连接,页按照主键的顺序排序;(2)每个页中的记录通过双向链表维护,物理存储上可以不按照主键存储。

辅助索引

聚集索引与辅助索引的区别在于,聚集索引的叶节点存放行记录;辅助索引的叶节点存放书签,InnoDB存储引擎通过这个书签可以找到与索引相对应的行记录。

 

B+树索引的分裂

B+树索引的节点的插入不完全同于B+树的节点的插入;这是因为通常情况下,插入是按照主键顺序来的,这就导致对半分裂会浪费磁盘空间。

 

此时插入应该向右分裂,而不是对半分裂。

 

Fast Index Creation:对于辅助索引的创建,InnoDB存储引擎对创建索引的表加上S锁。

Cardinality值

对于B+树索引,通常在访问表中很少一部分时使用B+树索引才有意义。Cardinality值记为索引中不重复记录数的预估值。Cardinality值/n_row接近1时,创建B+树索引是很有必要的。Cardinality值采用抽样统计。

Cardinality值的更新发生在INSERT与UPDATE操作中,但不是每次;在满足如下条件之一时更新:

  • 表中1/16的数据已经发生变化;
  • stat_modified_counter>200000000;

B+树中索引的使用

覆盖索引:从辅助索引就可以查询到的记录而不需要查询聚集索引的记录。

Multi-Range Read优化:减少磁盘的随机访问,并将随机访问转化为较为顺序的数据访问。其工作原理如下。

  • 将查询得到的辅助索引键值存放于一个缓存(此时按照辅助索引排序);
  • 将缓存中的键值按照主键排序;
  • 根据主键的排序顺序来访问实际的数据文件;

此外,Multi-Range Read还能将某些范围查询拆分为键值对,从而进行批量的数据查询,在拆分的过程中直接过滤掉不符合查询条件的数据。

Index Condition Pushdown优化:当进行索引查询时,先根据索引查找记录,再根据WHERE条件来过滤记录,在支持Index Condition Pushdown后,InnoDB存储引擎在取出索引的同时会判断是否满足WHERE条件。