Page 页
InnoDB 数据页结构
记录
记录头信息
- deleted_flag
- 逻辑删除
- 删除操作:
- 把deleted_flag=1(0是未删除)
- 把删除掉的记录,要组成一个垃圾链表。(目的:空间的可重用)
- min_rec_flag
- B+树每层非叶子节点中标识最小的目录项记录
- n_owned
- 把一个页划分成若干个组,一个组里的组长(组里主键最大)保存该值,该值表示一个组里有多少条记录
- heap_no
- 堆号,每条插入进来的记录都会分配堆号,从heap_no=2开始 infimum的堆号是0,superMun的堆号是1
- record_type
-
记录类型
-
普通记录
-
B+树每层非叶子节点目录项记录
-
表示infimun的记录
-
表示supermun的记录
-
-
- next_record
-
下一条记录。 从当前记录的真实数据到下一条记录的真实数据的距离
-
page Directory(页目录)
- 最底层的记录特点
- 按照主键从小到大排序
- 单向链表
- 图书的目录
- 分组的规则
- 对于infimum记录,组里只能有一条记录,就是他自己
- 对于supermum,组里只要能有1-8条记录
- 对于其他记录,组里只要能有4-8条记录
- 分组的步骤
- 最初的时候,没有记录,一个新的数据页有两个组,infimum组一条记录;另一是Supermum组一条记录
- 插入数据的时候,往supermum组里插入,n_owned要加一
- supermum组满了,进行拆分,一个组拆成两个组(4+5),申请新的槽位
- 删除记录操作
- delete_flag赋值为1
- 上一条的next_record指针指向下一条
- supermum的n_owned-1
- 查询的过程是什么?
- 先去找槽位
- 从组里面最小记录,next_record最小的开始遍历
B树&B+树
索引
- 聚簇索引 主键索引(B+树)
- 二级索引 非主键(给非主键加索引),找到对应的主键,进行回表操作,通过主键查找数据
- 联合索引
Buffer Pool缓冲池
- 缓存
- 索引、数据--->页--->磁盘里的
- 查一条记录 但是我们要把该记录的所在页都缓存到内存中
- 不在一个页里,那就会有大量的io操作
缓冲池概述
- 控制块和缓冲页是一一对应的
- free链表
- 用来分配空间的,将需要缓存的页,取得控制块,将需要缓存的页缓存起来
- flush链表
- 将修改过的缓冲页对应的控制块,放到flush链表里面,对应所有的脏页
- 什么时候,会将脏页刷新到磁盘?
-
从flush链表中刷新一部分页面到磁盘
- 后台有线程,根据系统的繁忙程度来确定刷新的速率。BUF_FLUSH_LIST
- 系统很繁忙,造成我们刷新脏页到磁盘的速度很慢,没有可用的缓冲页,就会去查看LRU链表尾部,是不是可以直接释放掉的未修改的缓冲页,如果没有的话,不得不将LRU链表尾部的一个脏页同步刷新到磁盘中。 BUF_FLUSH_SINGLE_PAGE
-
从LRU链表的冷数据汇总刷新一部分页面到磁盘 BUF_FLUSH_LRU
- 查询的时候,将使用过数据放到链表的头部
- 预读的时候把页会放到冷数据里面
- 全表扫不会冲掉热数据区域 可以配置XXX毫秒之内多次查询某页,就确定为全表扫
-
一个bufferpool有多个chunk,修改大小时,可以新建一个chunk,对原来的chunk进行复制
-