)
上次我们提到索引使用B树的数据结构现在我们继续谈关于索引的知识。MYSQL中的页页是内存与磁盘交互的最小单元默认大小为16KB每次的交互至少读取一页磁盘中每一页的地址是连续的根据局部性原理从而减少磁盘IO提高性能。页文件头与页文件尾如图这些是一个文件中一页的构成。还有页文件头与页文件尾的组成部分。这里我们只关注上一页与下一页页号通过这两个属性把页与页之间连接起来形成一个双向链表。通过页号和页大小可以计算出下一页与上一页在磁盘中的偏移量。页主体每创建一个新页都会自动分配两个行一个是页内最小行Infimun一个是页内最大行Supermun这两个行不存储任何真实信息而是作为数据行链表的头和尾当想页内插入新的数据行时如图所示总体上是一个单链表页目录在页目录中数据行会创建若干个分组而最小行单独在一组最大行必然在最后一组数据库的分组每个分组最多存储8行数据如果多于8个数据行就会强制分裂出下一个分组而在每创建一个分组时会在页目录中创建一个槽这个槽会绑定每个分组中的最后一个数据行的值同时存储这条记录的主键值。数据页头数据页头记录了当前保存数据的相关信息。例如要查找主键为6的数据行1.首先要找到这个条记录所有的页2.在页中找所在的槽3.在分组中找到对应的记录索引分类主键索引当一个表中定义了主键primary key 时就是主键索引自动创建索引索引的值就是主键列的值InnoDB把他作为聚集索引。普通索引最基本的索引类型为了提升查询效率工作中常为查询频繁的列创建索引。唯一索引在数据表中使用了unique唯一约束。全文索引基于文本列上创建用于全文搜索仅在MYISAM与InnoDB引擎支持。聚集索引与主键索引是同义词但当没有表定义primary key时InnoDB使用第一个unique和not null的列作为聚集索引。非聚集索引又叫二级索引每条记录都包含该行的主键列。非聚集索引的查询过程1.通过索引查到叶子节点中的索引记录2.通过索引记录中的主键值去主键索引树中找相应的完整记录这一步又叫回表查询索引覆盖可是上述索引的创建并不是韩信点兵多多益善因为创建索引后会生成一棵索引树创建多少索引就会生成多少索引树而生成的索引树也是会占用磁盘空间的索引树越多对数据库的增、删、改的效率影响越大因此创建索引时要慎重考虑一下需不需要。