[Mysql] 页结构
2024-09-08 15:09:22
什么是页?
- 页是InnoDB中管理数据的最小单元
- 页与页之间是通过一个双向链表连接起来。
页的组成
FileHeader
- 上一页下一页的指针
- 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
这块主要是为了防止页在刷入磁盘的过程中,由于极端的意外情况(网络问题、火灾、自然灾害)导致失败,而造成数据不一致的情况,也就是说形成了脏页。
一页能存储多少数据
页的默认大小为16kb,假设主键 ID 为 bigint 类型,长度为 8 字节,而指针大小在 InnoDB 源码中设置为 6 字节,这样一共 14 字节,我们一个页中能存放多少这样的单元,其实就代表有多少指针,即 16384/14=1170。所以我们每个非叶子结点最多有1170个子节点。
那么可以算出一棵高度为 2 的 B+ 树,能存放 117016=18720 条这样的数据记录。
根据同样的原理我们可以算出 一个高度为 3 的 B+ 树可以存放: 11701170*16=21902400 (2100万)条这样的记录。
最新文章
- mybatis generator.xml 配置 自动生成model,dao,mapping
- 新浪微博AppKey大集合(share)
- AngularJs bower install 卡主不动解决办法
- 前端这条路怎么走,作为一名后端er,说说我的见解
- NOIP2006金明的预算方案[DP 有依赖的背包问题]
- // 开始无限播放 ViewPager
- Zend Framework 入门(1)—快速上手
- 块设备驱动之NAND FLASH驱动程序
- 关于AfterLogic WebMail 的.net版无法上传控件的解决办法
- Docker Machine
- oldboy第二天学习
- freemarker报错之八
- php soap调用asp.net webservice
- linux 常用端口
- window.location获取URL中各部分
- java学习(二)多态中成员变量详解
- BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]
- Php的基本语法学习
- # 2017-2018-2 20155319『网络对抗技术』Exp6:信息收集与漏洞扫描
- rpm 安装zabbix 注意
热门文章
- Filter中的FilterChain.doFilter(req,resp)的报错解决
- KingbaseES的SQL语句-CTE递归
- gin如何多次shoubind一个请求参数
- Linux Netlink学习笔记
- LFS(Linux From Scratch)构建过程全记录(五):交叉工具链的构建
- 003-simonyanVeryDeepConvolutional2015(VGG)
- Redis变慢?深入浅出Redis性能诊断系列文章(一)
- 关于指针初始化为NULL的一些问题
- JAVA SE 基础总结
- 人脸识别、活体检测(眨眼、摇头、张嘴动作)clmtrackr