varchar类型的存储

放在磁盘文件挨着存储
比如存入hello 的时候还会存储一些另外的附加信息 方便定位 第一个附加信息就是长度列表
mysql 附加信息存储的方式是逆序的

40个bit 位的数据头以及真实数据如何存储

第一位和第二位是预留位
接下来有一位是delete_mask 标记这行记录是否被删除
min_rec_mask(B+树每个叶子节点的最小值都标记)
4位 n_owned(记录数)
13位 heap_no (这行数据在记录堆中的位置)
3位 record_type (这上数据类型 0代表普通类型, 1 代表b+树非叶子节点 ,2 代表最小值 ,3代表最大值)

真实数据存储的一系列标识

DB_ROW_ID(行标识)
DB_TRX_ID (事务标识)
DB_ROLL_PRT (回滚指针)

数据页的组成部分

mysql 数据存储结构 - 图1

insert 之后数据页的存储变化

mysql 数据存储结构 - 图2

null值的存储方式

通过二进制的bit 存储 bit是1表示空 0表示不为空

行溢出

一行数据存储的内容太多 一个数据页放不下把数据溢出的存放到其他数据页

表空间

组成

创建的表就是 .ibd文件

一个表空间里有多个数据页

数据区(extent) 管理数据页

一个数据区对应 64个数据页大小1mb
156个数据区被划分为一组
表空间的第一组数据区的第一个数据区的前三个数据页都是存放特殊信息
其他数据区的前一个数据区的前两个数据页也都是存放特殊信息
mysql 数据存储结构 - 图3

插入流程

根据表找到表空间
找到对应的磁盘文件
然后找数据区(extent)
然后找一个数据页
然后将数据加载 放到bufferpoll

RAID(磁盘冗余阵列)

mysql 数据存储结构 - 图4
mysql 数据存储结构 - 图5

缓存机制

mysql 数据存储结构 - 图6

RAID锂电池充放电问题导致的存储性能抖动 解决方案

1.给RAID卡把锂电池换成电容,电容是不用频繁充放电的,不会导致充放电的性能抖动,还有就是电容可以支持透明充放电,就是自动检查电量,自动进行充电,不会说在充放电的时候让写IO直接走磁盘,但是更换电容很麻烦,而且电容比较容易老化,这个其实一般不常用
2.手动充放电,这个比较常用,包括一些大家知道的顶尖互联网大厂的数据库服务器的RAID就是用了这个方案避免性能抖动,就是关闭RAID自动充放电,然后写一个脚本,脚本每隔一段时间自动在晚上凌晨的业务低峰时期,脚本手动触发充放电,这样可以避免业务高峰期的时候RAID自动充放电引起性能抖动
3.充放电的时候不要关闭write back,就是设置一下,锂电池充放电的时候不要把缓存级别从write back修改为write through,这个也是可以做到的,可以和第二个策略配合起来使用

mysql 数据库连接池满的可能原因是因为 linux 句柄数的限制