next_record
串联起来
记录按照主键从小到大形成单向链表
2.2页目录上面我们知道了记录在页中按照主键从小到大的顺序串联成单向链表,那么怎么在一个页中根据主键找到目标记录昵——通过页目录进行二分查找 。
- 页目录生成过程
- 将infimum,supermum以及所有未被删除的记录,分成多个组
- 每一个组中最大的记录的
n_owned
存储组中记录条数 - 将每一个组中最后的记录在页面中的地址偏移量,存储到页面尾部——
Page Directory
中,这些地址偏移量称为槽
文章插图
- 根据查询页面记录的过程
通过二分法找到目标记录中的槽,然后遍历槽所在组的所有记录
文章插图
目录项记录的只是主键值和页号两个列,最下方是我们刚刚讲到的innoDB存储用户记录的页 。如果页面数据量很大,可以继续为目录项建立目录项
文章插图
3.2 根据目录项定位数据行的过程例如查找主键为10记录
- 根据目录项中的内容,确定目标记录所在的页
如上图页33 存在记录(1,30),(320 32),可以判断主键位于1~320范围的记录在页30,大于320的记录在页32
- 找到页30后还要继续在页30中,通过目录项记录的页确定目标记录真正所在的页
- 在真正存储用户记录的页(页28)中通过槽定位到组,然后遍历槽所在组的所有记录
文章插图
文章插图
如果数据表定义了主键,那么这个主键索引就是聚集索引,如果没有定义主键,mysql会选择该表的第一个非空唯一的索引构建聚集索引,如果都没有那么mysql会生成一个隐藏的列(6字节的列,并且插入自增)
自增主键会把数据自动向后插入,避免了插入过程中聚集索引节点分裂的问题 。节点分裂会带来大范围的数据物理移动,带来磁盘IO的性能损耗,并且我们一般建议尽量不要改动主键,主键的更改也会带来page分裂,产生碎片 。
四丶回表查询
文章插图
文章插图
如上图,假如我们有一张表存在三个字段
id,age,name
我们在id上建立了主键索引,这时候id主键索引也是聚集索引,在age上建立了普通索引,这时候age索引就是非聚集索引 。如果我们执行
经验总结扩展阅读
- 十二星座喜欢通过什么小细节秀恩爱
- 新房装修验收注意哪些细节
- 用golang开发系统软件的一些细节
- 记一次批量更新整型类型的列 → 探究 UPDATE 的使用细节
- 火影忍者究极风暴怎么调整画质
- 发朋友圈的七种步骤(发朋友圈的细节和技巧)
- 库克首次回应iPhone13的细节_iphone13官方最新消息
- 上官婉儿怎么免伤害连招(上官婉儿怎么玩连招细节)
- 电视剧忠者无敌演员表介绍?
- 丑女无敌结局是什么?