第七章第一节 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条件。