MySQL执行流程

连接器-查询缓存(如果是select才查询缓存, MySQL8.0废弃)-解析器(词法分析, 语法分析)-预处理器(判断表/字段是否存在)-优化器-执行器(验证权限, 调用存储引擎API, 如果有索引下推则携带索引条件给存储引擎判断-存储引擎查询数据并利用索引下推过滤数据, 然后执行回表查询数据, 向执行器(server层)返回结果)

MySQL执行流程图

分析器

分析器, 来自小林coding
分析器, 来自小林coding

varchar字段最大取值计算公式

65535 - 变长字段字节数列表所占用的字节数 - NULL值列表所占用的字节数 = 65535 - 2 - 1 = 65532

如果有多个字段的话,要保证所有字段的长度 + 变长字段字节数列表所占用的字节数 + NULL值列表所占用的字节数 <= 65535

InnoDB 行格式及数据溢出处理方式

行格式 适用场景 存储空白列 行头大小 溢出处理
Compact 适用于索引列,OLAP 场景 不存储 固定 部分真实数据存储在数据页,溢出数据存储在溢出页中,通过指针连接溢出页
Dynamic 适用于非索引列,OLTP 场景 存储 可变 完全的行溢出方式,记录的真实数据处不存储该列的一部分数据,只存储 20 个字节的指针来指向溢出页
Compressed 适用于需要压缩存储的场景,Barracuda 存储 可变 完全的行溢出方式,记录的真实数据处不存储该列的一部分数据,只存储 20 个字节的指针来指向溢出页

Compressed 行格式中,如果数据行的大小超过了页的大小,InnoDB 存储引擎会使用分页压缩算法来减小数据的存储空间,但这并不是通过将溢出的数据存储在溢出页中来实现的。