目录

一、Innodb中页的概念

1、page头部

2、记录在页中的存储

 二、页内记录维护的顺序保证

1、逻辑有序和物理有序

2、槽管理


mysql数据库的数据存储结构是通过表空间(table space)->段(segment)->区(或者簇extends)->页(page)进行管理。

一、Innodb中页的概念

,是InnoDB中数据管理的最小单位。当我们查询数据时,其是以页为单位,将磁盘中的数据加载到缓冲池中的。同理,更新数据也是以页为单位,将我们对数据的修改刷回磁盘。

Page是Innodb存储的最基本结构,也是Innodb磁盘管理的最小单位,与数据库相关的所有内容都存储在Page结构里。Page分为几种类型:

  1. 数据页(B-Tree Node)
  2. Undo页(Undo Log Page)
  3. 系统页(System Page)
  4. 事务数据页(Transaction System Page)

每个数据页的大小为16kb,每个Page使用一个32位(一位表示的就是0或1)的int值来表示,正好对应Innodb最大64TB的存储容量(16kb * 2^32=64tib)

mysql中的具体数据是存储在行中的,而行是存储在页中的,每页的默认大小为16k(大小可以通过配置文件修改),页的结构如下图所示

preview

1、page头部

page头部保存了两个指针,分别指向前一个Page和后一个Page,头部还有Page的类型信息和用来唯一标识Page的编号。根据这个指针分布可以想象到Page链接起来就是一个双向链表

preview

2、记录在页中的存储

数据页的结构

2f3cbd5423f4715e64b4482c852cf38f.JPEG

 一开始生成页的时候并没有User Records这个部分.每当我们插⼊⼀条记录,都会从Free Space部分,也就是尚未使⽤的存储空间中申请⼀个记录⼤⼩的空间划分到User Records部分,当Free Space部分的空间全部被User Records部分替代掉之后,也就意味着这个页使⽤完了,如果还有新的记录插⼊的话,就需要去申请新的页了。

 二、页内记录维护的顺序保证

1、逻辑有序和物理有序

保证数据的存储顺序有两种方式:物理有序逻辑有序

物理有序:比如数组,存储都是连续的空间,查询速度很快,但是删除和移动数据非常麻烦

逻辑有序:比如链表,数据不是存储在连续的空间上,而是通过指针维护数据之间的顺序关系。查询需要遍历,但是数据移动代价比较小。

mysql数据库采用逻辑有序的方式来维护数据顺序,通过一定的数据结构来优化查询。

2、槽管理

数据记录在页内是如何保持有序的呢?答案就是槽管理。下图中的Slot区

Innodb是多条记录对应一个槽,而槽的作用就是用来在页面内进行数据搜索的,因为查找一条数据时,是用B+tree来保证通过树形结构找到一个记录所在的页,而在页内部真正找到这条记录是通过槽来完成的

在页内部,Innodb划分出一个区域比如10byte,作为槽的区域(当然槽的区域根据使用的大小是可以变化的),一个槽占用2个字节。那么现在可以将这个槽看作是长度大小为5的数组了。

 

关于存储引擎:MySQL存储底层技术:InnoDB底层原理解读

https://www.pianshen.com/article/22921668400/

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐