为了避免一条提条的读取磁盘的数据,InnoDB采取页的方式,作为磁盘和内存之间交互的基本方式
一个页的大小一般是16KB
InnoDB为了不同的目的而设计了多种不同类型的页:
1、存放表空间头部信息的页
2、粗放undo日志信息的页等…
把存放表中数据的页称为索引页或是数据页
数据页结构
数据页的头信息
最底层记录的特点
1、按照主键从小到大一次排序
2、单项列表
分组的规则
1、对于Infimum记录,组里只能有1条记录,就是本身
2、对于Supremum记录,组里只能有1-8条记录
3、对于其他的记录,组里面只能有4-8条记录
分组步骤
起初:没有记录,一个新的数据页有两个组,Infimum组1条记录,另一个是Supremum组1条记录
之后:插入数据的时候,往Supremum组里面插入,n_owned 加 一
最后:Supremum组满后,进行拆分,1个组拆分为2个组,申请新的槽位(Slot)
各个标志位的解释
物理删除(delete语句删除数据)& 逻辑删除(is_deleted字段) 0:未删除, 1:已删除
为什么不直接删除? 性能消耗
删除操作:
1、把deleted_flag=1
2、把删除掉的记录,组成一个垃圾链表(目的:空间的可重用性)
B+树每层非叶子节点中标识最小的目录项记录
把一个页划分成若干个组。一个组里的“大哥(组里面主键最大)”,会保存该值,该值标识一个组里有多少条记录
堆号。每条插入进来的记录都会分配堆号。从heap_no=2开始
为什么从heap_no=2开始?
infimum的heap_no=0(默认) 第一条
Supremum的heap_no=1(默认)最后一条
记录类型
0:普通记录(插入的记录)
1:B+树非叶子节点目录项记录
2:表示infimum的记录
3:表示Supremum的记录
下一条记录
注:从当前记录的真实数据到下一条记录的真实数据的距离
B树
B+树
B树和B+树的相同点
B树和B+树的不同点
B+树中,叶子节点里存储完整的数据(数据页)。非叶子节点,存储的主键索引(索引页)
聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。这个特性决定了索引组织表中数据也是索引的一部分
根据实际情况自行添加的索引都是辅助索引,辅助索引就是一个为了需找主键索引的二级索引,先找到主键索引再通过主键索引找数据
mysql使用 Innodb作为存储引擎, 并且数据都是以页(page)的形式存储在表空间里,因为磁盘访问速度很慢,所以为了提高速度,当访问某个页上面的数据时 ,先将这个页的所有数据加载到内存中并且缓存起来就可以对数据进行读写操作了,下次再次访就不需要再去磁盘里找了,为了提高效率这个内存就是buffer pool 缓存池
1、缓存作用
2、关系:索引、数据————>页————> 磁盘
3、select * from user where id = 1; 查询一条记录,但是需要把该记录所在的页的所有记录都查询出来放入内存那种
4、如果查询数据不在一个页里,就会导致有大量的io操作
5、某一刻,会将脏页刷新到磁盘?什么情况下刷新?
1、 从flush链表中刷新一部分页面到磁盘
后台有线程,根据系统的繁忙程度来确定刷新的速率。BUF_FLUSH_LISH
系统很繁忙,照成我们刷新脏页到磁盘的速度很慢。没有可用的缓冲液。就会去查看LRU链表尾部,是不是存在直接释放掉的未修改的缓冲液。如果没有,不得不将LRU链表尾部的一个脏页同步刷新到磁盘中。BUF_FLUSH_SINGLE_PAGE
2、从LRU链表的冷数据汇总刷新一部分页面到磁盘 BUF_FLUSH_LRU
flush链表
LRU链表
提示: