基础篇

1.MySql 执行流程

MySql执行流程图
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 种行格式,分别是 RedundantCompactDynamicCompressed 行格式。

2.3 COMPACT 行格式

Compact行格式
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 表的这三条记录作为例子:

User表
User表

表行格式如下:

user表Null值列表行格式
user表Null值列表行格式

当数据表的字段都定义成 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 行溢出

最后更新于