MySQL InnoDB存储及索引原理

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'

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值