MySQL查询执行流程
MySQL执行一条SELECT查询SQL起自于客户端发起的一条请求。MySQL服务收到请求后首先根据SQL查询缓存,若果该查询SQL已经事先执行过,则直接返回缓存中的数据给客户端。否则进入SQL解析优化阶段。MySQL解析器对SQL进行语法解析,生成解析树,然后经过预处理阶段生成一棵新的语法解析树。将解析树送入查询优化器中生成执行计划。查询执行引擎根据执行计划调用存储引擎的API查询数据。
由于InnoDB是MySQL默认的存储引擎,也是我们最常用到的存储引擎,我们也没有那么多时间去把各个存储引擎的内部实现都看一遍,所以本集要唠叨的是使用InnoDB作为存储引擎的数据存储结构,了解了一个存储引擎的数据存储结构之后,其他的存储引擎都是依葫芦画瓢。
InnoDB页的概念
为了提高读写效率,MySQL将磁盘数据划分为页。页是MySQL和磁盘读写数据交互的基本单位,InnoDB的页的大小一般为16KB,也就是一次从磁盘读取数据的数据量最小为16KB,写入时,一次最少写入16KB的数据。
InnoDB行的格式
设计InnoDB存储引擎的大叔们到现在为止设计了4种不同类型的行格式,分别是Compact、Redundant、Dynamic和Compressed行格式。
我们可以在创建或修改表的过程中指定行格式,如:
CREATE TABLE 表名 (列的信息) ROW_FORMAT=行格式名称
ALTER TABLE 表名 ROW_FORMAT=行格式名称
下面我们展开介绍这四种行格式。
Compact行格式
Compact行格式示意图如图:
从图中可以看出,Compact行格式分为两部分:额外信息和真实数据。
额外信息
变长字段长度列表:
如一些varchar(n)、Text、BLOB类型属于变长字段类型。变长字段长度列表就是记录这些变长字段长度的。需要注意的是,这里是按字段顺序的逆序存放,举例。
字段名 | 值 | 长度 |
a | ‘a' |
1 |
b |
‘aa' |
2 |
c |
‘aaa' |
3 |
Compact行:
3|2|1 |
NULL值列表 | 头信息 | 1 |
2 |
3 |
NULL值列表:
为了节省空间,NULL值是不需要存储的。所以Compact把这一行中所有的NULL值统一管理起来,放到”NULL
值列表“中。每一个NULL值对应一个二进制位,NULL值列表中的数据是将二进制位逆序进行存放的。
二进制位1时,代表对应位置的列为NULL。二进制位为0时代表对应位置不为NULL。
例如:
字段名 |
值 |
长度 |
a |
‘a' |