mysql与磁盘交互的基本单位是页而不是一条记录,页的大小是16k,对应的系统变量是innodb_page_size
页的类型
页名称 | 描述 |
---|---|
FILE_PAGE_UNDO_LOG | undo日志页 |
FILE_PAGE_INODE | 段信息页 |
FILE_PAGE_IBUF_BITMAP | change buffer属性页 |
FILE_PAGE_FREE_LIST | change buffer空闲列表 |
FILE_PAGE_TYPE_SYS | 系统数据页 |
FILE_PAGE_TYPE_TRX_SYS | 事务数据页 |
FILE_PAGE_FSP_HDR | 表空间信息页 |
FILE_PAGE_TYPE_XDES | 区属性页 |
FILE_PAGE_BLOB | 溢出页 |
FILE_PAGE_INDEX | 数据页 |
数据页的构成
File Header
描述页的校验和,页号,上/下页的指针,页的类型,页属于哪个表空间等信息
Page Header
记录了有多少个slot,空闲空间的偏移量,已经存储了多少条数据等信息
Infimum+Supremum
这两个并非是用户插入的数据,是虚拟列,Infimum代表着当前页中最小的数据行,Supremum代表当前页中最大的数据行(按照主键排序的大小),User records记录都位于它们之间,并且通过每条记录的行格式中的一些属性(next_record)形成按照主键排列顺序的数据链表,再加上最小的虚拟行Infimum与最大的Supremum就组成了当前页的数据链表.
User records
用户插入的数据行
Free sparce
当前未存放用户数据的空间
Page Directory
如果一行数据长度比较小,比如表只有一个int类型的id字段,那么一个页中会存放非常多的行记录.如果查询数据就需要遍历页中所有的记录取出满足select条件的数据,这样的话遍历速度会比较慢.Page Directory存放了很多slot,slot存放着每个组中最大的数据行的偏移量,数据链表是按照主键排列有序的,所以Page Directory可以使用二分查找法快速定位要插入与快速查找的数据在页中的位置.组的生成逻辑三言两语说不清楚,可以直接理解成,对于当前页中的数据行进行横向划分,大部分组中数据有4-8行.
File Trailer
存储了校验和和LSN,与File Header的校验和一起校验数据的准确性
综合
数据行格式的next_record属属性是指向下一条真实数据的指针,所以页里面的数据行形成一个单向链表,页与页之间通过File Header里面的上一页/下一页指针形成双向链表: