究极无敌细节版 Mysql索引( 四 )

next_record串联起来
记录按照主键从小到大形成单向链表
2.2页目录上面我们知道了记录在页中按照主键从小到大的顺序串联成单向链表,那么怎么在一个页中根据主键找到目标记录昵——通过页目录进行二分查找 。

  1. 页目录生成过程
    1. 将infimum,supermum以及所有未被删除的记录,分成多个组
    2. 每一个组中最大的记录的n_owned存储组中记录条数
    3. 将每一个组中最后的记录在页面中的地址偏移量,存储到页面尾部——Page Directory中,这些地址偏移量称为

    究极无敌细节版 Mysql索引

    文章插图
  2. 根据查询页面记录的过程
    通过二分法找到目标记录中的槽,然后遍历槽所在组的所有记录
3.InnoDB索引方案3.1为页建立目录项InnoDB使用也作为管理和存储空间的基本单位,最多只能保证16k的连续存储 。
究极无敌细节版 Mysql索引

文章插图
目录项记录的只是主键值和页号两个列,最下方是我们刚刚讲到的innoDB存储用户记录的页 。如果页面数据量很大,可以继续为目录项建立目录项
究极无敌细节版 Mysql索引

文章插图
3.2 根据目录项定位数据行的过程例如查找主键为10记录
  1. 根据目录项中的内容,确定目标记录所在的页
    如上图页33 存在记录(1,30),(320 32),可以判断主键位于1~320范围的记录在页30,大于320的记录在页32
  2. 找到页30后还要继续在页30中,通过目录项记录的页确定目标记录真正所在的页
  3. 在真正存储用户记录的页(页28)中通过槽定位到组,然后遍历槽所在组的所有记录
三丶聚集索引和非聚集索引InnoDB存储引擎是索引组织表——表中的数据按照主键顺序存放 。非聚集索引也称做辅助索引,无论是聚集还是非聚集,其原理都是一颗B+树,叶子节点都存储数据,不同的是聚集索引叶子节点存储的是一整行的数据,非聚集索引叶子节点存储的是聚集索引值(主键值) 。
究极无敌细节版 Mysql索引

文章插图

究极无敌细节版 Mysql索引

文章插图
如果数据表定义了主键,那么这个主键索引就是聚集索引,如果没有定义主键,mysql会选择该表的第一个非空唯一的索引构建聚集索引,如果都没有那么mysql会生成一个隐藏的列(6字节的列,并且插入自增)
自增主键会把数据自动向后插入,避免了插入过程中聚集索引节点分裂的问题 。节点分裂会带来大范围的数据物理移动,带来磁盘IO的性能损耗,并且我们一般建议尽量不要改动主键,主键的更改也会带来page分裂,产生碎片 。
四丶回表查询
究极无敌细节版 Mysql索引

文章插图

究极无敌细节版 Mysql索引

文章插图
如上图,假如我们有一张表存在三个字段id,age,name我们在id上建立了主键索引,这时候id主键索引也是聚集索引,在age上建立了普通索引,这时候age索引就是非聚集索引 。如果我们执行

经验总结扩展阅读