文章目录
前言
InnoDB分配内存,内外存交换,数据存储都是按照页来分配的,因此要搞清楚InnoDB的存储原理,首先就要搞懂页的结构。
一页默认大小是16KB,每个页都是用一个32位的int值来表示,经过计算得出16*2^32=64T,即InnoDB的最大储量为64T。
一、页的结构图
按照官网的说法,页的结构如下图所示:
二、各个组成部分的阐述
2.1 Fil Header
共占38字节,主要记录左右兄弟页面指针,控制信息等,官网的介绍截图如下:
FIL_PAGE_SPACE:页所在空间的4个id值(请忽略我不太专业的翻译,哈哈),读其他大佬写的书籍介绍,这个玩意就是checksum。
FIL_PAGE_OFFSET:页在当前空间中的偏移量,即当前页的指针位置
FIL_PAGE_PREV:指向上一页的偏移
FIL_PAGE_NEXT:指向下一页的偏移
FIL_PAGE_LSN:当前页最新被修改的日志序列位置
FIL_PAGE_TYPE:当前页的类型,FIL_PAGE_INDEX,FIL_PAGE_UNDO_LOG,FIL_PAGE_INODE,FIL_PAGE_IBUF_FREE_LIST
FIL_PAGE_FILE_FLUSH_LSN:文件至少被更新到了LSN值,仅对文件中的第一个页有效
FIL_PAGE_ARCH_LOG_NO:写入FIL_PAGE_FILE_FLUSH_LSN时的最新的存档日志文件号
2.2 Page Header
共占56字节,主要用来记录页的状态信息,共有14部分组成:
PAGE_N_DIR_SLOTS:在页目录中的slots槽的数量;
PAGE_HEAP_TOP:堆中第一个记录的指针,注意“记录在页中是以堆的形式存放的”
PAGE_N_HEAP:堆中的记录数
PAGE_FREE:指向第一个可重用记录的指针
PAGE_GARBAGE:已删除记录的字节数
PAGE_LAST_INSERT:最后插入位置的指针
PAGE_DIRECTORY:最后插入的方向(PAGE_LEFT,PAGE_RIGHT,PAGE_NO_DIRECTORY)
PAGE_N_DIRECTORY:连续插入相同目录的数量
PAGE_N_RECS:该页记录的数量
PAGE_MAX_TRX_ID:已经修改当前页一条记录的最大事务ID,(仅仅在Secondary Index中设置)
PAGE_LEVEL:当前页在索引中的位置,叶节点的层级是0
PAGE_INDEX_ID:当前页所属的索引id
PAGE_BTR_SEG_LEAF:在B树中叶子 页的文件段头(File segment header)(这个玩意无关紧要),"某一本畅销书籍中说的是:B+树非页节点所在的段头,一脸懵逼,感觉差别还是很大,不过官网总是没有错的,所以以我这个为准"
PAGE_BTR_SEG_TOP:在B树中非叶 页的文件段头(这个玩意无关紧要),某书籍中说的正好说反,看我的准没错
2.3 The Infimum and Supermum Records
最小虚记录和最大虚记录,最小虚记录比记录的最小键值还小,最大虚记录比记录的最大键值还大。
在InnoDB中,在Root Page中当第一个索引被创建时,他们就被自动创建了,并且不能被删除。
2.4 User Records
用户插入的实际记录,这点没什么好说的。
2.5 Free Space
自由空间,他是一个链表结构,当记录被删除后会被假如到当前链表中
2.6 Page Directory
页目录,也叫槽,在innoDB中并不是每条记录都有一个槽,而是一个槽中有多条记录,在一个比较饱满的页中,一个槽通常包含六条记录。
需要记住的是,B+树索引本身并不能找到一个具体的目录,能找到的只是其中的一个页,数据库把页载入到内存中,然后通过Page Directory再进行二叉查找。
2.7 Fil Trailer
Fil Trailer只有一部分组成:
Fil_PAGE_END_LSN:第四位 记录页的checksum,最后四位和Fil_page_lsn记录的一样
Fil Trailer主要作用即校验页的完整性,看是否由损坏。
数据库每次把页载入内存时都会对页进行校验,而该部分有一定的开销,用户可以通过innodb_checksums来开启或者关闭校验。
5.6.6开始新增innodb_checksum_algorithm,该参数用来控制checksum的算法,默认的时crc32.
三、总结
通过以上的内容,咱们会发现内容还是比较多,各个组成部分也比较复杂,那么哪些时比较重要的呢?
我认为有以下几个部分:
Fil Header:左右兄弟指针,控制信息
Infimum and Supremum records:最小虚记录和最大虚记录
User Records:用户记录
Free Space:自由空间链表
page directory:页目录或者叫slots槽
Fil Tralier:校验用。
记住以上内容也基本够用了。
最后如果你对技术有热爱,你对编程有热情,欢迎加入程序猿大家庭,咱们一起成长,一起进步。