1.区extent(簇):
一个区默认64个连续数据页。默认值是1M空间。
区也可以被称之为“簇”。也是聚簇索引中的分配单元,通常也是read-ahead的单元。
页 page 是mysql最小的IO单元默认16KB。
数据页的结构:
通用结构
Fil Header #数据页使用空间的量和指针,当前数据页最新的日志序列号。
Page Header #还有多少空闲的空间,还可以计算索引树高度。
The Infimum and Supremum Records # 最大值,最小值,索引扫描时候的一个参考。
Page Directory #页目录数据行的索引
Fil Trailer #判断数据页是否被损坏
2.行格式的介绍:
MySQL目前有4种行格式:Redundant、Compact、Dynamic、Compressed
Version 5.6 已经默认使用 Compact
Version 5.7+ 默认使用Dynamic
结构说明:
1、存储单元为页(page),16KB(16384B)
2、每页至少需要存两条数据
3、每条记录都会有记录头
4、每条记录3个隐藏列(rowId,transactionId,rollPointer)
5、记录按照聚簇索引组织存储
Compact介绍:
变长字段(记录的长度)列表 + NULL列表 + 记录头信息 + 列值
变长字段(记录的长度)列表:采用1-2个字节来表示一个字段的长度
记录头信息:使用5个字节来表示,主要包含:该记录是否被删除,记录类型,下一条记录的相对偏移量;
隐藏列: rowId,transactionId,rollPointer
Dynamic:
与Compact行格式很像,差异在于页面溢出的处理上;
Compressed:
在于Dynamic使用了压缩算法;
页溢出:
因为每页16KB,至少存储两行,所以每行大概有8KB的数据;抛开记录头信息等,大致每列超过768B就会产生页溢出;
Compact介绍:
1、会将溢出的数据单独放入一个页;外加20B存储额外页的信息(plus the 20-byte pointer to theexternally stored part)
2、索引可以使用前768B
768B —-> utf8 varchar(255) 如果是UTF8mb4最好设置 191字符
Dynamic:
1、如果页溢出,则使用20B存储整个列信息(列数据都存储在溢出页上)(with the clustered indexrecord containing only a 20-byte pointer to the overflow page)
2、可以使用前3072B字符的索引(—innodb-large-prefix决定)
3072B —-> utf8 varchar(1022)
3072B —-> utf8mb4 varchar(766)
建议:
5.7+ 版本Dynamic。
建议,大字段不要存储到MySQL 核心业务表中。
或者非得用,建议将大列做hash值运算,然后单独存储一列,每次查询按照hash值列进行查询。
结论:
Compact:768字节
Dynamic:3072字节
建立索引时:列值长度不能超过以上字节数
