签到成功

知道了

CNDBA社区CNDBA社区

MySQL InnoDB Row Format(行记录格式) 说明

2021-08-01 10:10 1209 0 转载 MySQL
作者: dave

在MySQL InnoDB引擎中,Row format 行记录格式决定表的行物理存储模式,决定query和dml操作性能。越多的行匹配进独立的磁盘页,query和index查找会快一些,需要的缓存就越少,及io操作。

表由B-tree index和二级索引(secondary index)组成,B-tree代表了整个表,也称做聚集索引(cluster index),由主键组织划分。聚集索引的节点数据结构包含全部列的值。二级索引的节点包含索引列的值和主键列的值。http://www.cndba.cn/dave/article/4641

http://www.cndba.cn/dave/article/4641

变长的列单独存放在磁盘页,也称作溢出页(overflow pages)。这样的列称为页外列,页外列的值存储在溢出页的单链接列表中,每个列有一个或者多个溢出页列表。变长列的prefix存储在B-tree中。

对于InnoDB存储引擎而言,常见的行格式类型有Compact、Redundant、Dynamic和Compressed。

http://www.cndba.cn/dave/article/4641
http://www.cndba.cn/dave/article/4641

[dave@www.cndba.cn ~]# mysql -hlocalhost -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or /g.
Your MySQL connection id is 127295411
Server version: 5.7.26-log MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '/h' for help. Type '/c' to clear the current input statement.

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

mysql>

在MySQL 5.7中,默认使用的是dynamic 。官方手册里对该参数有详细说明:http://www.cndba.cn/dave/article/4641http://www.cndba.cn/dave/article/4641

参考:https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format.html

http://www.cndba.cn/dave/article/4641

1.REDUNDANT

  • (1)B-tree存储变长列(VARCHAR, VARBINARY, BLOB, TEXT)的前768字节,剩下的部分存储在溢出页中。
  • (2)固定长度列,超过768字节的视为变长列。

特点:

http://www.cndba.cn/dave/article/4641

  • (1)每个索引记录包括6字节头,头部用于将连续的记录连接在一起,并用于锁定行。
  • (2)聚集索引中的记录,包括用户定义的全部列。另外,有一个6字节的事务ID和7字节的滚动指针。
  • (3)如果表中没有定义一个主键,记录也会包含一个6字节的行ID。
  • (4)每个二级索引记录包含主键列。
  • (5)每条记录的字段对应一个指针,如果字段的长度少于128字节,指针则是一个字节,否则就是两个字节。指针数组称为记录目录。指针指向的区域为记录的数据部分。
  • (6)固定长度的列,CHAR(10),以固定长度格式存储。VARCHAR的结尾空格不会截断。
  • (7)固定长度列大于768字节的,以变长列编码。
  • (8)SQl-null值存储一个或者两个字节在记录目录中,若为变长数据区域无值。若为固定长度,数据区域存储固定长度,值为null。为NULL保留固定长度允许列由null更新为non-null,避免索引页碎片。

2.COMPACT

compact格式比redundant存储空间减少20%。如果受限于cache命中和磁盘速度,compact格式会快一些,若受限于CPU速度,compact格式会慢一些。

compact格式存储变长列的前768字节于B-tree节点中,剩余部分存储在溢出页中。固定长度大于768字节的以变长列方式处理。

特点:

  • (1)每个索引记录包含5个字节头部,头部之前可能会有一个变长的头。头部用于链接连续的记录以及行级锁定。
  • (2)变长记录的头部包含bit向量标志NULL列。若列中可以为NULL的列数量为N,bit向量占CEILING(N/8)字节。头部变长部分也包含变长列的长度,视列最大长度而定,占1个或2字节。若全部列不能为null且有固定长度,记录头部则无变长部分。
  • (3)对于每个non-null变长字段,记录头部包含一个字节或两个字节长度,存储列长度。若列存储于溢出页或者最大列长度超过255字节,而且实际长度超过127字节时需要两个字节。对于外部存储的列,2字节长度表示内部存储列部分的长度加上指向外部存储的20字节指针。内部存储部分768字节,所以长度为768+20。20字节指针存储列的真实长度。
  • (4)聚集索引中的记录包括全部用户定义的列。另外,还有一个6字节的事务ID和7字节滚动指针。
  • (5)如果表内没有定义主键,聚集索引记录则会包含一个6字节的行ID。
  • (6)每个二级索引记录包含所有主键列。如果有变长的主键列,二级索引记录的头部有一个变长部分记录它们的长度,尽管二级索引定义在固定长度列上。
  • (7)内部,固定长度字符列以固定长度存储。对于VARCAHR尾部空格部位截断;
  • (8)对于变长字符,InnoDB尝试用N字节存储Char(N),包括去除尾部空格;若字符字节数超过N,最小字符长度为结尾空格剔除后的值,最大为字符最大字节长度*N。

3.DYNAMIC

基于compact格式,提高存储容量,支持大索引(large index)3072字节,由innodb_large_prefix参数控制。http://www.cndba.cn/dave/article/4641

http://www.cndba.cn/dave/article/4641

  • (1) 行格式为dynamic时,变长列为完全页外存储,聚集索引记录包含一个20字节的指针指向溢出页。固定长度列,超过768字节时,以变长列方式存储。

  • (2) 列是否存储在页外时,依赖页大小和行总大小。
    当一行太长时,将选择最长的列作为页外存储,直到聚集索引记录适合于B-tree页面。TEXT或者BLOB列小于40字节的存储一行。

  • (3) 可采用系统表空间,独立表空间,普通表空间。

4.COMPRESSED

基于dynamic格式,支持表和索引数据压缩。compressed行格式采用dynamic相同的页外存储细节,和额外的需要压缩的表和索引数据存储,更小的页大小。KEY_BLOCK_SIZE参数控制由多少列数据存储在聚集索引,多少存储在溢出页。Innodb_file_per_table变量必须开启,innodb_file_format必须是barracuda。

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
dave

dave

关注

人的一生应该是这样度过的:当他回首往事的时候,他不会因为虚度年华而悔恨,也不会因为碌碌无为而羞耻;这样,在临死的时候,他就能够说:“我的整个生命和全部精力,都已经献给世界上最壮丽的事业....."

  • 2239
    原创
  • 3
    翻译
  • 547
    转载
  • 186
    评论
  • 访问:6656468次
  • 积分:4249
  • 等级:核心会员
  • 排名:第1名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ