其实我比较抗拒把一堆参数列出来,告诉你这个大小多少,那个用来干嘛。对于我们需要详细了解页来说,其实暂时只需要知道两个就足够了,分别是:
- FIL_PAGE_PREV
- FIL_PAGE_NEXT
这两个变量就是上文提到过的上一页指针和下一页指针,说是指针,是为了方便大家理解,实际上是页在磁盘上的偏移量。
4.2、Page Header
比起 File Header
,Page Header
中的数据对我们来说就显得更加熟悉了,我这里画了一张图,把里面的内容详细的列了出来。
这里全列出来是因为了解这些参数的含义和为什么要设置参数,能够更好的帮助我们了解页的原理和构造,具体的看图说话就行。
这里也很想吐槽,太多博客都写的太僵硬,比如参数 PAGE_HEAP_TOP
,这里的 HEAP
很多博客都直接叫堆。这就跟你给Init
写注释叫初始化一样,还不如不写。实际上你去研究一下就会知道,这里的堆实际上就是指User Records。
里面有个两个参数可能会有点混淆,分别是PAGE_N_HEAP
和PAGE_N_RECS
,都是当前 User Records
中记录的数量,唯一的不同在于,PAGE_N_HEAP
中是包含了被标记为删除的记录的, 而 PAGE_N_RECS
中就是实际上我们能够查询到的所有数据。
4.3、Infimum & Supremum Records
上文中提到,Infimum & Supremum Records
会记录当前页最大最小记录。实际上不准确,更准确的描述是最小记录和最大纪录的开区间。因为实际上 Infimum Records
会比当前页中的最小值还要小,而 Supremum Records
会比当前页中的最大值要大。
4.4、User Records
User Records
可以说是我们平时接触的最多的部分了,毕竟我们的数据最终都在这。页被初始化之后,User Records
中是没有数据的,随着系统运行,数据产生,User Records
中的数据会不断的膨胀,相应的 Free Space
空间会慢慢的变小。
关于 User Records
中的概念,之前已经聊过了。这里只聊我认为很关键的一点,那就是顺序。
我们知道,在聚簇索引中,Key 实际上会按照 Primary Key
的顺序来进行排列。那在 User Records
中也会这样吗?我们插入一条新的数据到 User Records
中时,是否也会按照 Primary Key
的顺序来对已有的数据重排序?
答案是不会,因为这样会拉低 MySQL 处理的效率。
User Records
中的数据是由单链表指针的指向来保证的,也就是说,行数据实际在磁盘上的表现,是按照插入顺序来排队的,先到的数据在前面,后来的数据在后面。只不过通过 User Records
中的行数据之间的单链表形成了一个按照 Primary Key
排列的顺序。
用图来表示,大概如下:
4.5、Free Space
这块其实变相的在其他的模块中讨论了,最初 User Records
是完全空的,当有新数据进来时,会来 Free Space
中申请空间,当 Free Space
没空间了,则说明需要申请新的页了,其他没什么特别之处。
4.6、Page Directory
这跟上文讨论的没什么出入,就直接跳过了。
4.7、File Trailer
这块主要是为了防止页在刷入磁盘的过程中,由于极端的意外情况(网络问题、火灾、自然灾害)导致失败,而造成数据不一致的情况,也就是说形成了脏页。
里面有只有一个组成部分:
五、总结
到此,我认为关于页的所有东西就聊的差不多了,了解了底层的页原理,我个人认为是有助于我们更加友好、理智的使用 MySQL 的,使其能发挥出自己应该发挥的极致性能。
以上就是浅谈MySQL之浅入深出页原理的详细内容,更多关于MySQL 页原理的资料请关注其它相关文章!
更多Mysql内容来自木庄网络博客
标签:Mysql
相关阅读 >>
mysql实现查询结果导出csv文件及导入csv文件到数据库操作_mysql
更多相关阅读请进入《mysql》频道 >>
数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。