https://www.cnblogs.com/gustavo

Gustavo's Blog

人类的赞歌是勇气的赞歌!

[Mysql] 页结构

什么是页?

  • 页是InnoDB中管理数据的最小单元
  • 页与页之间是通过一个双向链表连接起来。

页的组成

FileHeader


img

  • 上一页下一页的指针
    • FIL_PAGE_PREV
    • FIL_PAGE_NEXT
PageHeader

Infimum & Supremum Records

会记录当前页最大最小记录

User Records

随着系统运行,数据产生,User Records 中的数据会不断的膨胀,相应的 Free Space 空间会慢慢的变小。

  • 按照插入顺序来排队的,先到的数据在前面,后来的数据在后面
  • User Records 中的行数据之间的单链表形成了一个按照 Primary Key排列的顺序。
Free Space

Free Space 没空间了,则说明需要申请新的页了

Page Directory

MySQL 会在新增数据的时候就将对应的 Slot 创建好,有了 Page Directory ,就可以对一张页的数据进行粗略的二分查找。至于为什么是粗略,毕竟 Page Directory 中不是完整的数据,二分查找出来的结果只能是个大概的位置,找到了这个大概的位置之后,还需要回到 User Records 中继续的进行挨个遍历匹配。

File Trailer

这块主要是为了防止页在刷入磁盘的过程中,由于极端的意外情况(网络问题、火灾、自然灾害)导致失败,而造成数据不一致的情况,也就是说形成了脏页。
File Trailer

一页能存储多少数据

页的默认大小为16kb,假设主键 ID 为 bigint 类型,长度为 8 字节,而指针大小在 InnoDB 源码中设置为 6 字节,这样一共 14 字节,我们一个页中能存放多少这样的单元,其实就代表有多少指针,即 16384/14=1170。所以我们每个非叶子结点最多有1170个子节点。
那么可以算出一棵高度为 2 的 B+ 树,能存放 117016=18720 条这样的数据记录。
根据同样的原理我们可以算出 一个高度为 3 的 B+ 树可以存放: 1170
1170*16=21902400 (2100万)条这样的记录。

posted @ 2022-03-19 12:28  BitBean  阅读(714)  评论(0编辑  收藏  举报