MySQL-InnoDB Compact 行记录格式
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 行记录格式的更多相关文章
- InnoDB的行记录格式, Compact, Redundant, Compressed, Dynamic
InnoDB存储引擎和大多数数据库一样(如Oracle和Microsoft SQL Server数据库),记录是以行的形式存储的.这意味着页中保存着表中一行行的数据.到MySQL 5.1时,InnoD ...
- mysql: 关于MySQL InnoDB锁行还是锁表?
baidu zone - 关于MYSQL Innodb 锁行还是锁表,深入讲解
- 0809MySQL-InnoDB Compact 行记录格式
InnoDB存储引擎提供了compact(5.1后的默认格式)和redundant两个格式来存放行记录数据.redundant格式是为了兼容之前的版本而保留. mysql> show table ...
- [转]关于MYSQL Innodb 锁行还是锁表
关于mysql的锁行还是锁表,这个问题,今天算是有了一点头绪,mysql 中 innodb是锁行的,但是项目中居然出现了死锁,锁表的情况.为什么呢?先看一下这篇文章. 目时由于业务逻辑的需要,必须对数 ...
- COMPACT 行记录格式
CREATE TABLE `mytest` ( `t1` varchar() DEFAULT NULL, `t2` varchar() DEFAULT NULL, `t3` ) DEFAULT NUL ...
- mysql InnoDB 的行锁
表的引擎类型必须为InnoDB才可以进行此操作. 相关链接:http://www.cnblogs.com/CyLee/p/5579672.html 共享锁:单独运行前两句,然后新建一个会话使用第三句. ...
- MySQL InnoDB 行记录格式(ROW_FORMAT)
MySQL InnoDB 行记录格式(ROW_FORMAT) 一.行记录格式的分类和介绍 在早期的InnoDB版本中,由于文件格式只有一种,因此不需要为此文件格式命名.随着InnoDB引擎的发展,开发 ...
- InnoDB行记录格式(compact)、InnoDB数据页结构
1. compact 行记录格式: 变长字段长度列表,null标志位,记录头信息,列1数据,列2数据 …… 记录头信息中包含许多信息,只列举一部分: 名称 大小 描述 deleted_flag 1bi ...
- InnoDB -- 行记录格式
本文转载自InnoDB -- 行记录格式 分类 Named File Format InnoDB早期的文件格式(页格式)为Antelope,可以定义两种行记录格式,分别是Compact和Redunda ...
随机推荐
- VMware的存储野心(上):软件定义、分布式DAS支持
ChinaByte比特网 http://storage.chinabyte.com/291/12477791_2.shtml 11月29日(文/黄亮)- SDN(软件定义的网络,Software De ...
- Windows下的Qt Creator的安装
采用Qt和Qt creator分别下载和安装的方式:(需要手动设置关联Qt和Qt Creator) 一.软件下载 从http://qt-project.org/downloads分别下载Qt和Qt ...
- MySQL 主从错误
1: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log fil ...
- 解决 ERROR in native method: JDWP No transports initialized, jvmtiError=AGENT_ERROR_TRANSPORT_INIT(197)
在/etc/hosts文件中加入下面一行内容 127.0.0.1 localhost.localdomain localhost
- HTML拾遗
一:标签 1:强调 <strong>加醋.<em>斜体 2:单独样式 <span>如果不加样式,那它包围的文字就是普通文字,可以在span中增加样式,就所包围的内容 ...
- ES6学习笔记九:修饰器
一:修饰器(Decorator)是一个函数,用来修改类的行为. 1)定义与使用 function 修饰器名(target) { //target是被修饰对象,可用target.xxx进行调用修改 } ...
- cmake交叉编译android(转)
生成cmake编译所需的文件 #-H指向CMakeLists.txt文件父级目录 #-B指向中间产物目录 #-DCMAKE_LIBRARY_OUTPUT_DIRECTORY指向so输出目录 #-DCM ...
- 【转】Flash:同志们,这些知识点你们知道多少?(一些必备的Flash开发知识点)
1.理解flash的显示列表 2.理解事件冒泡,理解鼠标事件等 3.理解flash的性能瓶颈和大多数影响性能的地方4.理解帧跑道模型,知道timer和ent ...
- 〖Network〗宿舍配置两路由器,同时访问校园内网和校园外网
环境: 校园宿舍, 10.x.x.x 和 172.16.x.x~172.31.x.x是校园内网,本科教务系统什么的都在上边 路由器: 路由器1(校园内网):水星MR807 路由器2(拨号上网):TP ...
- 【Linux】条件判断eq、ne、gt、lt、ge、le
整数比较: -eq(equal) 相等 -ne(inequality) 不相等 -gt(greater than) 大于 -lt(less than) 小于 -ge(greater equal) 大于 ...