InnoDB行记录的结构
前言
本文是《从根上理解MySQL》第四章的读书笔记,主要介绍InnoDB的一条行记录的结构。
一、InnoDB页简介
MySQL 服务器上负责对表中数据的读取和写入工作的部分是存储引擎,MySQL默认的存储引擎是InnoDB。真实数据在不同存储引擎中存放的格式一般是不同的,而InnoDB是以InnoDB页的形式存放数据的。
InnoDB是将表中的数据存储到磁盘的存储引擎,所以关机重启后数据还在。数据处理的过程是发生在内存中的,所以需要把磁盘中的数据加载到内存,若是修改和写入的情况,还需把内存中的内容刷新到磁盘。读写磁盘速度比直接内存读写的速度相差非常大,为了解决直接读写磁盘慢的问题,InnoDB采取:将数据分为若干页,以页作为磁盘和内存交互的基本单位,页一般大小为16KB。
二、InnoDB行格式
记录是像表中插入数据的单位,记录在磁盘上存放形式称为行格式或者记录格式。行格式有四种类型:COMPACT、REDUNDANT、DYNAMIC、COMPRESSED。
2.1 指定行格式的语法
在创建或修改表的语句中指定行格式:
CREATE TABLE 表名 (
列的信息
) ROW_FORMAT=行格式名称
ALTER TABLE 表名 ROW_FORMAT=行格式名称
2.2 COMPACT行格式
可以看出,一条完整的记录分为:记录的额外信息与记录的真实数据。
2.2.1 记录的额外信息
这部分信息是服务器为了描述这条记录而不得不额外添加的一些信息,这些额外信息分为3类,分别是变长字段长度列表、NULL值列表和记录头信息。
a. 变长字段长度列表
变长字段中存储多少字节的数据是不固定的,如:VARCHAR(M) 、VARBINARY(M) 、各种TEXT 类型,各种BLOB 类型,把拥有这些数据类型的列称为变长字段。
变长字段占用的存储空间包括:真正的数据内容与占用的字节数。
在Compact 行格式中,把所有变长字段的真实数据占用的字节长度都存放在记录的开头部位,从而形成一个变长字段长度列表,各变长字段数据占用的字节数按照列的顺序逆序存放,注意是逆序。如:
——例子:
创建一个表,指定字符集为ascii,指定行格式为COMPACT:
CREATE TABLE record_format_demo (
c1 VARCHAR(10),
c2 VARCHAR(10) NOT NULL,
c3 CHAR(10), -- 注意c3不是变长字段
c4 VARCHAR(10)
) CHARSET=ascii ROW_FORMAT=COMPACT;
记住,我们采用的是ascii字符集,后面讲的都是针对这个字符集!!!!!ascii字符集中表示一个字符最多需要使用1个字节数。
插入两条数据:
INSERT