InnoDB存储引擎提供了compact(5.1后的默认格式)和redundant两个格式来存放行记录数据。redundant格式是为了兼容之前的版本而保留。

mysql> show table status like 't1'\G;
*************************** 1. row ***************************
           Name: t1
         Engine: InnoDB
        Version: 10
     Row_format: Compact
           Rows: 2
 Avg_row_length: 8192
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2016-01-11 05:04:28
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options:
        Comment:
1 row in set (0.00 sec)

ERROR:
No query specified

mysql>

Compact行记录的格式

-变长字段长度列表:如果列的长度小于255字节,用1字节表示;如果大于255个字节,用2字节表示
-NULL标志位:表明该行数据是否有NULL值。占一个字节。
-记录头信息:固定占用5字节,每位的含义见下表:

名称 大小(bit) 描述
 ()  1  未知
 ()  1  未知
 delete_flag  1  该行是否已被删除
 min_rec_flag  1  为1,如果该记录是预先被定义为最小的记录
 n_owned  4   该记录拥有的记录数
 heap_no  13  索引堆中该记录的排序记录
 record_type  3  记录类型,000表示普通,001表示B+树节点指针,010表示infimum,011表示supermum,1xx表示保留
next_record   16  页中下一条记录的相对位置
 total  40  

在每个列的存储数据中,NULL不占该部分任何空间。此外还有两个隐藏列,事务ID列和回滚指针列,分别为6字节和7字节。若innodb表没有定义主键,每行还会增加一个6字节的rowid列。

mysql> create table yb1(
    -> t1 varchar(10),
    -> t2 varchar(10),
    -> t3 char(10),
    -> t4 varchar(10)
    -> ) row_format=compact;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into yb1 values('a','bb','bb','ccc');
Query OK, 1 row affected (0.00 sec)

mysql> insert into yb1 values('d','ee','ee','fff');
Query OK, 1 row affected (0.00 sec)

mysql> insert into yb1 values('d',NULL,NULL,'fff');
Query OK, 1 row affected (0.01 sec)

mysql> select * from yb1\G
*************************** 1. row ***************************
t1: a
t2: bb
t3: bb
t4: ccc
*************************** 2. row ***************************
t1: d
t2: ee
t3: ee
t4: fff
*************************** 3. row ***************************
t1: d
t2: NULL
t3: NULL
t4: fff
3 rows in set (0.00 sec)

mysql>
# hexdump -C -v yb1.ibd  > yb1.txt
然后分析:
0000c070  73 75 70 72 65 6d 75 6d  03 0a 02 01 00 00 00 10  |supremum........|
0000c080  00 2d 00 00 01 fa dd d5  00 00 00 00 39 ea a3 00  |.-..........9...|
0000c090  00 01 e8 01 10 61 62 62  62 62 20 20 20 20 20 20  |.....abbbb      |
0000c0a0  20 20 63 63 63 03 0a 02  01 00 00 00 18 00 2b 00  |  ccc.........+.|
0000c0b0  00 01 fa dd d6 00 00 00  00 39 eb a4 00 00 01 e9  |.........9......|
0000c0c0  01 10 64 65 65 65 65 20  20 20 20 20 20 20 20 66  |..deeee        f|
0000c0d0  66 66 03 01 06 00 00 20  ff 96 00 00 01 fa dd d7  |ff..... ........|
0000c0e0  00 00 00 00 39 f0 a7 00  00 01 ea 01 10 64 66 66  |....9........dff|
0000c0f0  66 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |f...............|
0000c100  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0000c110  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0000c120  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

第一行记录从0000c078开始:
03 0a 02 01 /* 变长字段长度列表,逆序的(03表示t4字段的值ccc的长度,0a表示t3字段的长度,02表示t2字段的值bb的长度,01表示t1字段的值a的长度)*/
00 /* NULL标志位,第一行没有NULL值 */
00 00 10 00 2d /* record header,固定5字节 */
00 00 01 fa dd d5 /* rowid,innodb自动创建,6个字节 */
00 00 00 00 39 ea /* 事务ID */
a3 00 00 01 e8 01 10 /* 回滚指针 */
61 /* 列1数据'a' */
62 62 /* 列2数据'bb' */
62 62 20 20 20 20 20 20 20 20  /* 列3数据'bb' (固定长度未完全使用时,使用0x20表示) */
63 63 63 /* 列4数据'ccc' */

第二行记录从0000c0a5开始:
03 0a 02 01 /* 变长字段长度列表,逆序的(03表示t4字段的值fff的长度,0a表示t3字段的长度,02表示t2字段的值ee的长度,01表示t1字段的值d的长度)*/
00 /* NULL标志位,第一行没有NULL值 */
00 00 18 00 2b /* record header,固定5字节 */
00 00 01 fa dd d6 /* rowid,innodb自动创建,6个字节 */
00 00 00 00 39 eb /* 事务ID */
a4 00 00 01 e9 01 10 /* 回滚指针 */
64 /* 列1数据'd' */
65 65 /* 列2数据'ee' */
65 65 20 20 20 20 20 20 20 20  /* 列3数据'ee' (固定长度未完全使用时,使用0x20表示) */
66 66 66 /* 列4数据'fff' */
record header的最后两个字节代表是下一个记录的偏移量,本例中是0x2b(即43)

第三行记录从0000c0d2开始:
03 01 /* 变长字段长度列表,逆序的(03表示t4字段的值fff的长度,01表示t1字段的值d的长度)*/
06 /* NULL标志位,第三行有NULL值。06换成二进制为00000110,表示第2,3列是null */
00 00 20 ff 96 /* record header,固定5字节 */
00 00 01 fa dd d7 /* rowid,innodb自动创建,6个字节 */
00 00 00 00 39 f0 /* 事务ID */
a7 00 00 01 ea 01 10 /* 回滚指针 */
64 /* 列1数据'd' */
64 64 64 /* 列4数据'fff' */

http://blog.jcole.us/2013/01/07/the-physical-structure-of-innodb-index-pages/

MySQL-InnoDB Compact 行记录格式的更多相关文章

  1. InnoDB的行记录格式, Compact, Redundant, Compressed, Dynamic

    InnoDB存储引擎和大多数数据库一样(如Oracle和Microsoft SQL Server数据库),记录是以行的形式存储的.这意味着页中保存着表中一行行的数据.到MySQL 5.1时,InnoD ...

  2. mysql: 关于MySQL InnoDB锁行还是锁表?

          baidu zone - 关于MYSQL Innodb 锁行还是锁表,深入讲解

  3. 0809MySQL-InnoDB Compact 行记录格式

    InnoDB存储引擎提供了compact(5.1后的默认格式)和redundant两个格式来存放行记录数据.redundant格式是为了兼容之前的版本而保留. mysql> show table ...

  4. [转]关于MYSQL Innodb 锁行还是锁表

    关于mysql的锁行还是锁表,这个问题,今天算是有了一点头绪,mysql 中 innodb是锁行的,但是项目中居然出现了死锁,锁表的情况.为什么呢?先看一下这篇文章. 目时由于业务逻辑的需要,必须对数 ...

  5. COMPACT 行记录格式

    CREATE TABLE `mytest` ( `t1` varchar() DEFAULT NULL, `t2` varchar() DEFAULT NULL, `t3` ) DEFAULT NUL ...

  6. mysql InnoDB 的行锁

    表的引擎类型必须为InnoDB才可以进行此操作. 相关链接:http://www.cnblogs.com/CyLee/p/5579672.html 共享锁:单独运行前两句,然后新建一个会话使用第三句. ...

  7. MySQL InnoDB 行记录格式(ROW_FORMAT)

    MySQL InnoDB 行记录格式(ROW_FORMAT) 一.行记录格式的分类和介绍 在早期的InnoDB版本中,由于文件格式只有一种,因此不需要为此文件格式命名.随着InnoDB引擎的发展,开发 ...

  8. InnoDB行记录格式(compact)、InnoDB数据页结构

    1. compact 行记录格式: 变长字段长度列表,null标志位,记录头信息,列1数据,列2数据 …… 记录头信息中包含许多信息,只列举一部分: 名称 大小 描述 deleted_flag 1bi ...

  9. InnoDB -- 行记录格式

    本文转载自InnoDB -- 行记录格式 分类 Named File Format InnoDB早期的文件格式(页格式)为Antelope,可以定义两种行记录格式,分别是Compact和Redunda ...

随机推荐

  1. 使用visual studio code调试php代码

    这回使用visual studio code折腾php代码的调试,又是一顿折腾,无论如何都进不了断点.好在就要放弃使用visual studio code工具的时候,折腾好了,汗~ 这里把步骤记录下来 ...

  2. input[type="checkbox"]与label对齐

    项目中遇到文字与 checkbook 无法水平对齐, 源码如下: <div align='center'> <input type="checkbox" id=& ...

  3. Postgresql中的数据类型大全

    一.数值类型: 下面是PostgreSQL所支持的数值类型的列表和简单说明: 名字 存储空间 描述 范围 smallint 2 字节 小范围整数 -32768 到 +32767 integer 4 字 ...

  4. strus2 struts.xml详解

    <struts> <!-- 配置一个包:package --> <package name="demo1" extends="struts- ...

  5. A Dog's Way Home插曲列表

    The movie songs A Dog's Way Home   文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论

  6. windows快捷键补充?

      win + + 放大镜 win + r osk 虚拟键盘 win + r psr 自带屏幕录制   文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论

  7. WIN下Git GUI 教程

    现在很多都有git来托管项目或者来查找资料,但是看起来操作不是很方便,现在由于win下可以直接使用git gui,让使用git变得方便,当然这只是针对日常简单的使用,如果想详细的使用,可以去参考廖学峰 ...

  8. 【转发】PHP连接MSSQL数据库案例,PHPWAMP多个PHP版本连接SQL Server数据库

    转发自:http://blog.csdn.net/lccee/article/details/54289076 课前小知识普及:MSSQL和SQL Server是同一个软件,叫法不同而已,MSSQL全 ...

  9. 改变mysql客户端输出的字符串编码

    在客户端改变中文输出的编码,通常以gbk输出,因为电脑常见的是gbk编号形式 目的:不改变编码,输出中文的时候,可能会出现乱码的情况, set names gbk 在客户端以gbk编码显示需要输出的内 ...

  10. Jquery 获取对象的几种方式(转载)

    1.先讲讲JQuery的概念 JQuery首先是由一个 America 的叫什么 John Resig的人创建的,后来又很多的JS高手也加入了这个团队.其实 JQuery是一个JavaScript的类 ...