基础篇
1.MySql 执行流程

MySQL 的架构共分为两层:Server 层和 存储引擎 层:
- Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现,主要包括连接器,查询缓存、解析器、预处理器、优化器、执行器等。另外,所有的内置函数(如日期、时间、数学和加密函数等)和所有跨存储引擎的功能(如存储过程、触发器、视图等。)都在 Server 层实现。
- 存储引擎层负责数据的存储和提取。支持 InnoDB、MyISAM、Memory 等多个存储引擎,不同的存储引擎共用一个 Server 层。现在最常用的存储引擎是 InnoDB,从 MySQL 5.5 版本开始, InnoDB 成为了 MySQL 的默认存储引擎。常说的索引数据结构,就是由存储引擎层实现的,不同的存储引擎支持的索引类型也不相同,比如 InnoDB 支持索引类型是
B+
树 ,且是默认使用,也就是说在数据表中创建的主键索引和二级索引默认使用的是B+
树索引。
2.如何存储一行记录
2.1 表空间文件的结构
表空间由 段 segment、区 extent、页 page、行 row 组成,InnoDB 存储引擎的逻辑存储结构大致如下图:
2.2 InnoDB 行格式
行格式就是一条记录的存储结构。InnoDB 提供了 4 种行格式,分别是 Redundant、Compact、Dynamic 和 Compressed 行格式。
2.3 COMPACT 行格式

2.3.1 额外数据
2.3.1.1 变长字段长度列表
2.3.1.2 NULL 值列表
表中的某些列可能会存储 NULL
值,如果把这些 NULL
值都放到记录的真实数据中会比较浪费空间,所以 Compact 行格式把这些值为 NULL
的列存储到 NULL
值列表中。
如果存在允许 NULL 值的列,则每个列对应一个二进制位(bit),二进制位按照列的顺序 逆序排列。
- 二进制位的值为 1 时,代表该列的值为 NULL。
- 二进制位的值为 0 时,代表该列的值不为 NULL。
另外,NULL 值列表必须用整数个字节的位表示(1 字节 8 位),如果使用的二进制位个数不足整数个字节,则在字节的高位补 0。
以 user 表的这三条记录作为例子:
表行格式如下:
当数据表的字段都定义成 NOT NULL
的时候,这时候表里的行格式就不会有 NULL
值列表了。
记录头信息
- delete_mask: 标识此条数据是否被删除。从这里可以知道,执行 detele 删除记录的时候,并不会真正的删除记录,只是将这个记录的 delete_mask 标记为 1。
- next_record: 下一条记录的位置。从这里可以知道,记录与记录之间是通过链表组织的。在前面我也提到了,指向的是下一条记录的「记录头信息」和「真实数据」之间的位置,这样的好处是向左读就是记录头信息,向右读就是真实数据,比较方便。
- record_type: 表示当前记录的类型,0 表示普通记录,1 表示 B+树非叶子节点记录,2 表示最小记录,3 表示最大记录。
2.3.2 真实数据
2.4 varchar(n)
2.5 行溢出
最后更新于