暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

架构师必经路之InnoDB储存原理深入剖析(一),内容太干,建议收藏

程序猿每日分享 2021-10-25
404

文章目录

    • 前言

    • 一、页的结构图

    • 二、各个组成部分的阐述

      • 2.1 Fil Header

      • 2.2 Page Header

      • 2.3 The Infimum and Supermum Records

      • 2.4 User Records

      • 2.5 Free Space

      • 2.6 Page Directory

      • 2.7 Fil Trailer

    • 三、总结


前言

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:校验用。

复制

记住以上内容也基本够用了。

最后如果你对技术有热爱,你对编程有热情,欢迎加入程序猿大家庭,咱们一起成长,一起进步。

如果你喜欢本文

请长按二维码,关注程序猿每日分享

转发至朋友圈,是对我最大的支持


点个在看
小时候有种感觉叫喜欢
长大后有种支持叫再看
💕💕💕💕💕💕


文章转载自程序猿每日分享,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论