MySQL-InnoDB Compact 行记录格式

    xiaoxiao2022-06-22  24

    http://www.cnblogs.com/abclife/p/5121677.html

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

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 mysql> show  table  status  like  't1' \G; *************************** 1. row ***************************             Name : t1           Engine: InnoDB          Version: 10       <strong>Row_format: Compact</strong>             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列。

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 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> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 # 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/

    转载请注明原文地址: https://ju.6miu.com/read-1123062.html

    最新回复(0)