MYSQL的页
MYSQL的页
什么是页,页里面有啥
官方说法:
说白了就是在mysql中内存和磁盘最小的交互单元,大小是16kb,因为他是一整块一整块地址的申请,每次交互又读一页,你存储的数据或者想读取的一般来说都是相对靠近的,他一次读一页,就可以减少io的次数,性能自然就提高了。
就算你这个页内没有数据,他也是要分配16kb的存储空间,索引也是和b+树的节点对应,为什么要分配16kb呢,因为Linux操作系统中最小的管理文件单位是4kb,mysql作为一个数据库,显然不能那么少,就整多了点变成了16kb。
数据页/索引页
是⽤来存储数据和索引的"索引⻚",也叫做"数据 ⻚",不论哪种类型的⻚都会包含⻚头(FileHeader)和⻚尾(FileTrailer),⻚的主体信息使⽤数 据"⾏"进⾏填充
结构长这样:
页的文件头和文件尾

页的主体
主体的结构

页的主体,这里就是我们存写文件的地方,每一个新的页,都是会存在两行的,一个是最大行一个最小行,说白了就是类似于两个指针,模拟链表的头和尾,每当写入一个数据,next_record就会指向新的,就和链表的新增一样,最形成一个单链表。

页的目录
结构图

这里需要注意的点
先看右边:
- 最小行是单独一个组
- 数据进行分组的时候每个组可以存8条,超过就会分一个新的组
- 最大行是在最后一个组的最下面
再看左边:
蓝色那里有三个槽位,槽是怎么产生?
槽的产生和分组是密切相关的,只要产生了分组这个动作,就会自动产生一个槽,他会记录下来分组最后的那条记录,同时会把他的主键值给记下来,有多少个分组就有多少个槽位。
假设要查找一个主键是6的,
首先会找到这个页,然后去找到槽,然后再从分组里面找到改记录。
数据页头
B+树在mysql中的使用

叶子节点存储真实数据,非叶子存储索引,其次在B+树中叶子节点是构成双向循环链表的,在查找某个索引时,先判断根节点,然后在判断大小,之后再去寻找到对应的数据,这个和树的高度是有关系的
计算三层B+树存放记录

首先,因为我们知道,一页的默认大小是16kb,索引页存放的主键值是bigint类型的就是8个byte,下一个地址是6byte,也就是一条索引占14个byte,
一页的大小是16*1024= 16384,如果一页全部放索引(根节点)也就是可以放16384/14=1170个索引,那二层每一个也可以放1170个索引,也就是1170*1170=1368900个索引,第三层每个索引又能放16个数据也就是1368900*16=21902400条数据,这个过程只执行了三次oi,索引页会被缓存在内存,查询一条没查过的实际上只要一次真实的oi就可以。
