innodb存储引擎-存储结构
2022-04-07 15:43:31 20 举报
mysql innodb存储引擎-存储结构
作者其他创作
大纲/内容
一条用户记录主要包含三部分内容:记录额外信息,它包含了变长字段、null值列表和记录头信息。隐藏列,它包含了行id、事务id和回滚点。真正的数据列,包含真正的用户数据,可以有很多列。
最后插入记录的位置
页头部
数据
索引id
数据页3
批次
文件尾部
用户记录
Supremum
加载
目前innodb自动创建的隐藏列有三种:db_row_id,即行id,它是一条记录的唯一标识。db_trx_id,即事务id,它是事务的唯一标识。db_roll_ptr,即回滚点,它用于事务回滚
数据6
最小记录
下一条记录的位置
文件头部
在数据刷新到磁盘之前,会先计算一个数据页的校验和。后面如果数据有更新的话,会计算一个新值。文件头部中也会记录这个校验和,由于文件头部在前面,会先被刷新到磁盘上。
记录头信息
记录额外信息
真正数据列
数据2
隐藏列
用户记录2
磁盘
Infimum记录
数据1
删除标记
行id
Null值列表
用户记录3
内存
槽1
槽2
页目录
行数据1
总结:MySQL表中的所有数据被存储在一个空间内,称之为表空间,表空间内部又可以分为段(segment)、区(extent)、页(page)、行(row)多个数据页之间通过页号构成了双向链表。而每一个数据页的行数据之间,又通过下一条记录的位置构成了单项链表。整体架构图如下:
已删除记录所占的字节数
数据页1
最大记录
校验和
数据页
回滚点
列值n
将内存中的数据刷到磁盘,或者将磁盘中的数据加载到内存,都是以批次为单位,这个批次就是我们常说的:数据页数据页:主要是用来存储表中记录的,它在磁盘中是用双向链表相连的,方便查找,能够非常快速得从一个数据页,定位到另一个数据页数据页主要包含如下几个部分:文件头部页头部最大和最小记录用户记录空闲空间页目录文件尾部
数据页2
空闲空间
页号
数据5
数据页4
在保存用户记录时,数据库会自动创建两条额外的记录:Supremum 和 Infimum。它们之间的关系,如下图所示:从图中可以看出用户数据是从最小记录开始,通过下一条记录的位置,从小到大,一步步查找,最后找到最大记录为止
最大事务id
分组4
用户记录1
innodb是通过页号、上一页页号和下一页页号来串联不同数据页的
分组3
变长字段列表
用户记录相连:记录额外信息 》 记录头信息 》下一条记录的位置:多条用户记录之间通过下一条记录的位置,组成了一个单向链表。这样就能从前往后,找到所有的记录了。
读操作:从磁盘上一次读一批数据,然后加载到内存当中,以后就在内存中操作
真正的数据列
Supremum记录
数据4
堆上的位置
页类型
记录类型
写操作
数据3
索引层级
下一页页号
最大和最小记录
Infimum
分组2
分组1
列值1
拥有的记录数
槽3
页目录:页目录是有多个槽组成把一页用户记录分为若干组,每一组的最大记录都保存到一个地方,这个地方就是页目录。每一组的最大记录叫做槽
最小目录标记
槽4
事务id
记录头信息主要包含:deleted_flag:即删除标记,用于标记该记录是否被删除了。min_rec_flag:即最小目录标记,它是非叶子节点中的最小目录标记。n_owned:即拥有的记录数,记录该组索引记录的条数。heap_no:即堆上的位置,它表示当前记录在堆上的位置。record_type:即记录类型,其中:0表示普通记录,1表示非叶子节点,2表示Infrimum记录, 3表示Supremum记录。next_record:即下一条记录的位置。
刷盘
上一页页号
0 条评论
下一页