MySQL的行格式(Compact、Redundant、Dynamic和Compressed)

前言

以下原理部分,都只说compact行格式。(?因为compact是基础,后两种都是基于它衍生出来的)

行格式在哪里看,怎么修改行格式

查看

mysql> show table status like '%dbooptest%' \G
*************************** 1. row ***************************
           Name: dbooptest
         Engine: InnoDB
        Version: 10
     Row_format: Dynamic
           Rows: 9
 Avg_row_length: 1820
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2020-06-10 20:22:49
    Update_time: 2020-06-10 20:22:49
     Check_time: NULL
      Collation: utf8mb4_unicode_ci
       Checksum: NULL
 Create_options: 
        Comment: 测试
1 row in set (0.00 sec)

修改

CREATE TABLE dbooptest (id int ....) ROW_FORMAT=Compact;
    
ALTER TABLE 表名 ROW_FORMAT=Compressed; #注意不要在轻易在线上环境修改行格式,基本上等同于:作死!

查看当前默认的row_format

mysql> show global variables like 'innodb_default_row_format';
+---------------------------+---------+
| Variable_name             | Value   |
+---------------------------+---------+
| innodb_default_row_format | dynamic |
+---------------------------+---------+
1 row in set (0.00 sec)

代入开发者来思考怎么存储一条数据

理解compact格式的时候,你可以尝试代入Innnodb存储引擎的开发人员,怎么极限压缩存储空间。

假定有这样一张表,

create table dbooptest(
id int unsigned  not null primary key ,
username varchar(20) not null default '',
userdesc varchar(255)
) ENGINE=InnoDB  COMMENT='测试表' ;


# insert 一条记录
insert into dbooptest (id,username,userdesc) values (1,'51ak',null);

我们来思考如何减少存储空间

是不是很极限?

真实的compact行格式

如上所说,我们知道compact格式真实的存储方式如下图所示

图:compact格式

innodb_compact01

对照真实的数据

innodb_compact01

第一部分:变长字段长度列表

变长的数据类型,varchar,VARBINARY(M)、各种TEXT类型,各种BLOB,这些都是变长类型。因为他们存储多少字节数据是不确定的,所以存储数据的时候,得把他们占用的字节数存起来。 所以这些变长字段占用需要记录它占用的字节数

在Compact行格式中

第二部分:NULL值列表

第三部分:记录头信息(重要)

它是由固定的5个字节组成。5个字节也就是40个二进制位,不同的位代表不同的意思,如图:

这些二进制位代表的详细信息如下表:

图:compact格式下的记录头信息

innodb_compact02

对照真实的记录头信息

innodb_compact04

记录头各位置的意义

第四部分:记录的真实数据

数据的隐藏列 (重要):

mysql会给每个记录添加一些隐藏列,

这里的DB_TRX_ID和DB_ROLL_PTR 非常非常重要,是事务的核心知识点。

数据:

最后才是正实的数据,这时候反而简单了

compact行格式和dynamic,compressed的区别

接上一节的最后一句话,当数据存储时,真实数据超过了768个字节(这里有个称呼:行溢出)

以上就是Innodb的行格式了,一方面需要思考MySQL是怎么做到尽可能少的利用空间把数据存储清楚。

更重要的是

>> Home

51ak

2020/06/18

Categories: mysql innodb 原理 Tags: 原创

《数据库工作笔记》公众号
扫描上面的二维码,关注我的《数据库工作笔记》公众号