InnoDB -- 行记录格式
本文转载自InnoDB -- 行记录格式
分类

Named File Format
- InnoDB
早期的文件格式(页格式)为Antelope,可以定义两种行记录格式,分别是Compact和Redundant Named File Format为了解决不同版本下页结构的兼容性,在Barracuda可以定义两种新的行记录格式Compressed和Dynamic- 变量为
innodb_file_format和innodb_default_row_format
mysql> SHOW VARIABLES LIKE 'innodb_file_format';
+--------------------+-----------+
| Variable_name | Value |
+--------------------+-----------+
| innodb_file_format | Barracuda |
+--------------------+-----------+
1 row in set (0.00 sec)
mysql> SHOW VARIABLES LIKE '%row%format%';
+---------------------------+---------+
| Variable_name | Value |
+---------------------------+---------+
| innodb_default_row_format | dynamic |
+---------------------------+---------+
1 row in set (0.38 sec)
行记录最大长度
页大小(
page size)为4KB、8KB、16KB和32KB时,行记录最大长度(maximum row length)应该略小于页大小的一半- 默认页大小为
16KB,因此行记录最大长度应该略小于8KB,因此一个B+Tree叶子节点最少有2个行记录
- 默认页大小为
页大小为
64KB时,行记录最大长度略小于16KB
CHAR(N)与VARCHAR(N)
N指的是字符长度,而不是Byte大小,在不同的编码下,同样的字符会占用不同的空间,如LATIN1(定长编码)和UTF8(变长编码)
变长列
在InnoDB中,变长列(variable-length column)可能是以下几种情况
长度不固定的数据类型,例如VARCHAR、VARBINARY、BLOB、TEXT等- 对于
长度固定的数据类型,如CHAR,如果实际存储占用的空间大于768Byte,InnoDB会将其视为变长列 变长编码下的CHAR
行溢出
- 当
行记录的长度没有超过行记录最大长度时,所有数据都会存储在当前页 - 当
行记录的长度超过行记录最大长度时,变长列(variable-length column)会选择外部溢出页(overflow page,一般是Uncompressed BLOB Page)进行存储Compact+Redundant:保留前768Byte在当前页(B+Tree叶子节点),其余数据存放在溢出页。768Byte后面跟着20Byte的数据,用来存储指向溢出页的指针Dynamic+Compressed:仅存储20Byte数据,存储指向溢出页的指针,这时比Compact和Redundant更高效,因为一个B+Tree叶子节点能存放更多的行记录

Redundant
MySQL 5.0之前的ROW_FORMAT
格式

字段偏移列表
- 按照列的顺序
逆序放置 - 列长度
小于255Byte,用1Byte存储 - 列长度
大于255Byte,用2Byte存储
记录头信息
| 名称 | 大小(bit) | 描述 |
|---|---|---|
| () | 1 | 未知 |
| () | 1 | 未知 |
| deleted_flag | 1 | 该行是否已被删除 |
| min_rec_flag | 1 | 如果该行记录是预定义为最小的记录,为1 |
| n_owned | 4 | 该记录拥有的记录数,用于Slot |
| heap_no | 13 | 索引堆中该条记录的索引号 |
| n_fields | 10 | 记录中列的数量,一行最多支持1023列 |
| 1byte_offs_flag | 1 | 偏移列表的单位为1Byte还是2Byte |
| next_record | 16 | 页中下一条记录的相对位置 |
| Total | 48(6Byte) |
nothing |
隐藏列
- ROWID
没有显式定义主键或唯一非NULL的索引时,InnoDB会自动创建6Byte的ROWID - Transaction ID
事务ID - Roll Pointer
非行溢出实例
表初始化
mysql> CREATE TABLE t (
-> a VARCHAR(10),
-> b VARCHAR(10),
-> c CHAR(10),
-> d VARCHAR(10)
-> ) ENGINE=INNODB CHARSET=LATIN1 ROW_FORMAT=REDUNDANT;
Query OK, 0 rows affected (0.23 sec)
mysql> INSERT INTO t VALUES ('1','22','22','333'),('4',NULL,NULL,'555');
Query OK, 2 rows affected (0.08 sec)
Records: 2 Duplicates: 0 Warnings: 0
$ sudo python py_innodb_page_info.py -v /var/lib/mysql/test/t.ibd
page offset 00000000, page type <File Space Header>
page offset 00000001, page type <Insert Buffer Bitmap>
page offset 00000002, page type <File Segment inode>
page offset 00000003, page type <B-tree Node>, page level <0000>
page offset 00000000, page type <Freshly Allocated Page>
page offset 00000000, page type <Freshly Allocated Page>
Total number of page: 6:
Freshly Allocated Page: 2
Insert Buffer Bitmap: 1
File Space Header: 1
B-tree Node: 1
File Segment inode: 1
行记录在page offset=3的页中
16进制信息
# Vim,:%!xxd
# page offset=3
0000c000: 32d4 0518 0000 0003 ffff ffff ffff ffff 2...............
0000c010: 0000 0000 408f 1c1b 45bf 0000 0000 0000 ....@...E.......
0000c020: 0000 0000 0112 0002 00db 0004 0000 0000 ................
0000c030: 00ba 0002 0001 0002 0000 0000 0000 0000 ................
0000c040: 0000 0000 0000 0000 0156 0000 0112 0000 .........V......
0000c050: 0002 00f2 0000 0112 0000 0002 0032 0801 .............2..
0000c060: 0000 0300 8a69 6e66 696d 756d 0009 0300 .....infimum....
0000c070: 0803 0000 7375 7072 656d 756d 0023 2016 ....supremum.# .
0000c080: 1413 0c06 0000 100f 00ba 0000 0014 b201 ................
0000c090: 0000 0014 08bf b900 0002 0301 1031 3232 .............122
0000c0a0: 3232 2020 2020 2020 2020 3333 3321 9e94 22 333!..
0000c0b0: 1413 0c06 0000 180f 0074 0000 0014 b202 .........t......
0000c0c0: 0000 0014 08bf b900 0002 0301 1f34 0000 .............4..
0000c0d0: 0000 0000 0000 0000 3535 3500 0000 0000 ........555.....
第1行记录(0xc07d)
- 长度偏移列表(
23 20 16 14 13 0c 06)
总共有7列,每列的长度都不超过255Byte,偏移列表的单位为1Byte,所以0xc07d~0xc083为长度偏移列表
| 列序号 | 长度 | 描述 |
|---|---|---|
| 1 | 6 = 0x06 |
ROWID,隐藏列 |
| 2 | 6 = 0x0c-0x06 |
Transaction ID,隐藏列 |
| 3 | 7 = 0x13-0x0c |
Roll Pointer,隐藏列 |
| 4 | 1 = 0x14-0x13 |
a VARCHAR(10) |
| 5 | 2 = 0x16-0x14 |
b VARCHAR(10) |
| 6 | 10 = 0x20-0x16 |
c CHAR(10) |
| 7 | 3 = 0x23-0x20 |
d VARCHAR(10) |
- 记录头信息(
00 00 10 0f 00 ba)
| 名称 | 值 | 描述 |
|---|---|---|
| n_fields | 7 | 记录中列的数量 |
| 1byte_offs_flag | 1 | 偏移列表的单位为1Byte |
ROWID(
00 00 00 14 b2 01)Transaction ID(
00 00 00 14 08 bf)Roll Pointer(
b9 00 00 02 03 01 10)a(
31)- 字符
1,VARCHAR(10),1个字符只占用了1Byte
- 字符
b(
32 32)- 字符
22,VARCHAR(10),2个字符只占用了2Byte
- 字符
c(
32 32 20 20 20 20 20 20 20 20)- 字符
22,CHAR(10),2个字符依旧占用了10Byte
- 字符
d(
33 33 33)- 字符
333,VARCHAR(10),3个字符只占用了3Byte
- 字符
第2行记录(0xc0ad)
- 长度偏移列表(
21 9e 94 14 13 0c 06)
总共有7列,每列的长度都不超过255Byte,偏移列表的单位为1Byte,所以0xc0ad~0xc0b3为长度偏移列表
| 列序号 | 长度 | 描述 |
|---|---|---|
| 1 | 6 = 0x06 |
ROWID,隐藏列 |
| 2 | 6 = 0x0c-0x06 |
Transaction ID,隐藏列 |
| 3 | 7 = 0x13-0x0c |
Roll Pointer,隐藏列 |
| 4 | 1 = 0x14-0x13 |
a VARCHAR(10) |
| 5 | 0(0x94-0x14=0x80>10) |
b VARCHAR(10) |
| 6 | 10 = 0x9e-0x94 |
c CHAR(10) |
| 7 | 3 = 0x21-(0x9e-0x94)-0x14 |
d VARCHAR(10) |
- 记录头信息(
00 00 18 0f 00 74)
| 名称 | 值 | 描述 |
|---|---|---|
| n_fields | 7 | 记录中列的数量 |
| 1byte_offs_flag | 1 | 偏移列表的单位为1Byte |
- ROWID(
00 00 00 14 b2 02) - Transaction ID(
00 00 00 14 08 bf)与第1条记录的事务ID一致(在InnoDB中会将INSERT VALUES视为在同一事务内,MyISAM则不会)
- Roll Pointer(
b9 00 00 02 03 01 1f) - a(
34)- 字符
4,VARCHAR(10),1个字符只占用了1Byte
- 字符
- b
VARCHAR为NULL时,不占用空间
- c(
00 00 00 00 00 00 00 00 00 00)CHAR(10)为NULL时,依旧占用10Byte
- d(
35 35 35)- 字符
555,VARCHAR(10),3个字符只占用了3Byte
- 字符
行溢出实例
表初始化
mysql> CREATE TABLE t (
-> a VARCHAR(9000)
-> ) ENGINE=INNODB CHARSET=LATIN1 ROW_FORMAT=REDUNDANT;
Query OK, 0 rows affected (0.08 sec)
mysql> INSERT INTO t SELECT REPEAT('a',9000);
Query OK, 1 row affected (0.05 sec)
Records: 1 Duplicates: 0 Warnings: 0
$ sudo python py_innodb_page_info.py -v /var/lib/mysql/test/t.ibd
page offset 00000000, page type <File Space Header>
page offset 00000001, page type <Insert Buffer Bitmap>
page offset 00000002, page type <File Segment inode>
page offset 00000003, page type <B-tree Node>, page level <0000>
page offset 00000004, page type <Uncompressed BLOB Page>
page offset 00000000, page type <Freshly Allocated Page>
Total number of page: 6:
Insert Buffer Bitmap: 1
Freshly Allocated Page: 1
File Segment inode: 1
B-tree Node: 1
File Space Header: 1
Uncompressed BLOB Page: 1
行记录的前768Byte在page offset=3的页中,但由于9000>8192>行记录最大长度,所以将剩余数据放在了溢出页,即page offset=4的页中
16进制信息
# Vim,:%!xxd
# page offset=3
0000c000: 17e8 3157 0000 0003 ffff ffff ffff ffff ..1W............
0000c010: 0000 0000 408f 6113 45bf 0000 0000 0000 ....@.a.E.......
0000c020: 0000 0000 0113 0002 03b2 0003 0000 0000 ................
0000c030: 008b 0005 0000 0001 0000 0000 0000 0000 ................
0000c040: 0000 0000 0000 0000 0157 0000 0113 0000 .........W......
0000c050: 0002 00f2 0000 0113 0000 0002 0032 0801 .............2..
0000c060: 0000 0300 8b69 6e66 696d 756d 0009 0200 .....infimum....
0000c070: 0803 0000 7375 7072 656d 756d 0043 2700 ....supremum.C'.
0000c080: 1300 0c00 0600 0010 0800 7400 0000 14b2 ..........t.....
0000c090: 0300 0000 1408 cea3 0000 01f9 0110 6161 ..............aa
0000c0a0: 6161 6161 6161 6161 6161 6161 6161 6161 aaaaaaaaaaaaaaaa
......
0000c390: 6161 6161 6161 6161 6161 6161 6161 0000 aaaaaaaaaaaaaa..
0000c3a0: 0113 0000 0004 0000 0026 0000 0000 0000 .........&......
0000c3b0: 2028 0000 0000 0000 0000 0000 0000 0000 (..............
......
# page offset=4
00010000: 273a f701 0000 0004 0000 0000 0000 0000 ':..............
00010010: 0000 0000 408f 6113 000a 0000 0000 0000 ....@.a.........
00010020: 0000 0000 0113 0000 2028 ffff ffff 6161 ........ (....aa
00010030: 6161 6161 6161 6161 6161 6161 6161 6161 aaaaaaaaaaaaaaaa
......
00012050: 6161 6161 6161 0000 0000 0000 0000 0000 aaaaaa..........
00012060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
......
- 长度偏移列表(
4327 0013 000c 0006)
总共有4列,a列的长度超过了255Byte,偏移列表的单位为2Byte,所以0xc07d~0xc084为长度偏移列表
| 列序号 | 长度 | 描述 |
|---|---|---|
| 1 | 6 = 0x0006 |
ROWID,隐藏列 |
| 2 | 6 = 0x000c-0x0006 |
Transaction ID,隐藏列 |
| 3 | 7 = 0x0013-0x000c |
Roll Pointer,隐藏列 |
| 4 | 9000(0x4327暂不理解) |
a VARCHAR(9000) |
- 记录头信息(
00 00 10 08 00 74)
| 名称 | 值 | 描述 |
|---|---|---|
| n_fields | 4 | 记录中列的数量 |
| 1byte_offs_flag | 0 | 偏移列表的单位为2Byte |
- ROWID(
00 00 00 14 b2 03) - Transaction ID(
00 00 00 14 08 ce) - Roll Pointer(
a3 00 00 01 f9 01 10) - a
page offset=3,前768Byte(0xc09e~0xc39d),在溢出页的长度为0x2028,即8232page offset=4为溢出页,存放后8232Byte的数据(0x1002e~0x12055)
Compact
MySQL 5.0引入,MySQL 5.1默认ROW_FORMAT
对比Redundant
- 减少了大约
20%的空间 - 在某些操作下会增加
CPU的占用 - 在
典型的应用场景下,比Redundant快
格式

变长字段长度列表
- 条件
VARCHAR、BLOB等变长编码(如UTF8)下的CHAR
- 放置排序:
逆序 - 用
2Byte存储的情况:需要用溢出页;最大长度超过255Byte;实际长度超过127Byte
NULL标志位
- 行记录中是否有NULL值,是一个位向量(
Bit Vector) - 可为NULL的列数量为N,则该标志位占用的
CEILING(N/8)Byte - 列为NULL时
不占用实际空间
记录头信息
| 名称 | 大小(bit) | 描述 |
|---|---|---|
| () | 1 | 未知 |
| () | 1 | 未知 |
| deleted_flag | 1 | 该行是否已被删除 |
| min_rec_flag | 1 | 如果该行记录是预定义为最小的记录,为1 |
| n_owned | 4 | 该记录拥有的记录数,用于Slot |
| heap_no | 13 | 索引堆中该条记录的索引号 |
| record_type | 3 | 记录类型,000(普通),001(B+Tree节点指针),010(Infimum),011(Supremum) |
| next_record | 16 | 页中下一条记录的相对位置 |
| Total | 40(5Byte) |
nothing |
实例
行溢出时的处理方式与Redundant类似,这里仅给出非行溢出的实例
表初始化
mysql> CREATE TABLE t (
-> a VARCHAR(10),
-> b VARCHAR(10),
-> c CHAR(10),
-> d VARCHAR(10)
-> ) ENGINE=INNODB CHARSET=LATIN1 ROW_FORMAT=COMPACT;
Query OK, 0 rows affected (0.03 sec)
mysql> INSERT INTO t VALUES ('1','22','22','333'),('4',NULL,NULL,'555'); Query OK, 2 rows affected (0.02 sec)
Records: 2 Duplicates: 0 Warnings: 0
$ sudo python py_innodb_page_info.py -v /var/lib/mysql/test/t.ibd
page offset 00000000, page type <File Space Header>
page offset 00000001, page type <Insert Buffer Bitmap>
page offset 00000002, page type <File Segment inode>
page offset 00000003, page type <B-tree Node>, page level <0000>
page offset 00000000, page type <Freshly Allocated Page>
page offset 00000000, page type <Freshly Allocated Page>
Total number of page: 6:
Freshly Allocated Page: 2
Insert Buffer Bitmap: 1
File Space Header: 1
B-tree Node: 1
File Segment inode: 1
行记录在page offset=3的页中
16进制信息
# Vim,:%!xxd
# page offset=3
0000c000: 1f96 f8df 0000 0003 ffff ffff ffff ffff ................
0000c010: 0000 0000 408f deaa 45bf 0000 0000 0000 ....@...E.......
0000c020: 0000 0000 0116 0002 00c3 8004 0000 0000 ................
0000c030: 00ac 0002 0001 0002 0000 0000 0000 0000 ................
0000c040: 0000 0000 0000 0000 015a 0000 0116 0000 .........Z......
0000c050: 0002 00f2 0000 0116 0000 0002 0032 0100 .............2..
0000c060: 0200 1e69 6e66 696d 756d 0003 000b 0000 ...infimum......
0000c070: 7375 7072 656d 756d 0302 0100 0000 1000 supremum........
0000c080: 2b00 0000 14b2 0a00 0000 1409 03c6 0000 +...............
0000c090: 020a 0110 3132 3232 3220 2020 2020 2020 ....12222
0000c0a0: 2033 3333 0301 0600 0018 ffc4 0000 0014 333............
0000c0b0: b20b 0000 0014 0903 c600 0002 0a01 1f34 ...............4
0000c0c0: 3535 3500 0000 0000 0000 0000 0000 0000 555.............
第1行记录(0xc078)
- 变长字段长度列表(
03 02 01)- 列a长度为1
- 列b长度为2
- 列c在
LATIN1单字节编码下,长度固定,因此不会出现在该列表中 - 列d长度为3
- NULL标志位(
00)- 在表中可以为NULL的可变列为a、b、d,
0< 3/8 < 1,所以NULL标志位占用1Byte 00表示没有字段为NULL
- 在表中可以为NULL的可变列为a、b、d,
- 记录头信息(
00 00 10 00 2b)- 本行记录结束的位置
0xc078+0x2b=c0a3
- 本行记录结束的位置
- ROWID(
00 00 00 14 b2 0a) - Transaction ID(
00 00 00 14 09 03) - Roll Pointer(
c6 00 00 02 0a 01 10) - a(
31)- 字符
1,VARCHAR(10),1个字符只占用了1Byte
- 字符
- b(
32 32)- 字符
22,VARCHAR(10),2个字符只占用了2Byte
- 字符
- c(
32 32 20 20 20 20 20 20 20 20)- 字符
22,CHAR(10),2个字符依旧占用了10Byte
- 字符
- d(
33 33 33)- 字符
333,VARCHAR(10),3个字符只占用了3Byte
- 字符
第2行记录(0xc0a4)
- 变长字段长度列表(
03 01)- 列a长度为1
- 列b、c为NULL,不占用空间,因此不会出现在该列表中,
NULL标志位会标识那一列为NULL - 列d长度为3
- NULL标志位(
06)0000 0110,表示列b和列c为NULL
- 记录头信息(
00 00 18 ff c4) - ROWID(
00 00 00 14 b2 0b) - Transaction ID(
00 00 00 14 09 03)- 跟第1行记录在
同一个事务内
- 跟第1行记录在
- Roll Pointer(
c6 00 00 02 0a 01 1f) - a(
34)- 字符
1,VARCHAR(10),1个字符只占用了1Byte
- 字符
- b
VARCHAR(10)为NULL时,不占用空间
- c
CHAR(10)为NULL时,不占用空间
- d(
35 35 35)
- 字符
555,VARCHAR(10),3个字符只占用了3Byte
Dynamic和Compressed
Dynamic和Compressed是Compact的变种形式Compressed会对存储在其中的行数据会以zlib的算法进行压缩,对BLOB、TEXT、VARCHAR这类大长度类型的数据能够进行非常有效的存储Dynamic(或Compressed)与Compact(或Redundant)比较大的差异是行溢出的处理方式,下面是Dynamic行溢出实例
表初始化
mysql> CREATE TABLE t (
-> a VARCHAR(9000)
-> ) ENGINE=INNODB CHARSET=LATIN1 ROW_FORMAT=DYNAMIC;
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO t SELECT REPEAT('a',9000); Query OK, 1 row affected (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 0
$ sudo python py_innodb_page_info.py -v /var/lib/mysql/test/t.ibd
page offset 00000000, page type <File Space Header>
page offset 00000001, page type <Insert Buffer Bitmap>
page offset 00000002, page type <File Segment inode>
page offset 00000003, page type <B-tree Node>, page level <0000>
page offset 00000004, page type <Uncompressed BLOB Page>
page offset 00000000, page type <Freshly Allocated Page>
Total number of page: 6:
Insert Buffer Bitmap: 1
Freshly Allocated Page: 1
File Segment inode: 1
B-tree Node: 1
File Space Header: 1
Uncompressed BLOB Page: 1
16进制信息
# Vim,:%!xxd
# page offset=3
0000c000: 0006 f2d2 0000 0003 ffff ffff ffff ffff ................
0000c010: 0000 0000 4090 bbcb 45bf 0000 0000 0000 ....@...E.......
0000c020: 0000 0000 011a 0002 00a7 8003 0000 0000 ................
0000c030: 0080 0005 0000 0001 0000 0000 0000 0000 ................
0000c040: 0000 0000 0000 0000 015e 0000 011a 0000 .........^......
0000c050: 0002 00f2 0000 011a 0000 0002 0032 0100 .............2..
0000c060: 0200 1d69 6e66 696d 756d 0002 000b 0000 ...infimum......
0000c070: 7375 7072 656d 756d 14c0 0000 0010 fff0 supremum........
0000c080: 0000 0014 b211 0000 0014 093d ee00 0001 ...........=....
0000c090: c201 1000 0001 1a00 0000 0400 0000 2600 ..............&.
0000c0a0: 0000 0000 0023 2800 0000 0000 0000 0000 .....#(.........
......
# page offset=4
00010000: 2371 f7ac 0000 0004 0000 0000 0000 0000 #q..............
00010010: 0000 0000 4090 bbcb 000a 0000 0000 0000 ....@...........
00010020: 0000 0000 011a 0000 2328 ffff ffff 6161 ........#(....aa
00010030: 6161 6161 6161 6161 6161 6161 6161 6161 aaaaaaaaaaaaaaaa
......
00012340: 6161 6161 6161 6161 6161 6161 6161 6161 aaaaaaaaaaaaaaaa
00012350: 6161 6161 6161 0000 0000 0000 0000 0000 aaaaaa..........
page offset=3中没有前缀的768Byte,Roll Pointer后直接跟着20Byte的指针page offset=4为溢出页,存储实际的数据,范围为0x1002d~0x12355,总共9000,即完全溢出
UTF8与CHAR
Latin1与UTF8代表了两种编码类型,分别是定长编码和变长编码UTF8对CHAR(N)的的处理方式在Redundant和Compact(或Dynamic、Compressed)中是不一样的Redundant中占用N * Maximum_Character_Byte_LengthCompact中最小化占用空间
Redundant实例
mysql> CREATE TABLE t (
-> a CHAR(10)
-> ) ENGINE=INNODB CHARSET=UTF8 ROW_FORMAT=REDUNDANT;
Query OK, 0 rows affected (0.02 sec)
mysql> INSERT INTO t SELECT 'a';
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
0000c090: 1409 69ae 0000 018d 0110 6120 2020 2020 ..i.......a
0000c0a0: 2020 2020 2020 2020 2020 2020 2020 2020
0000c0b0: 2020 2020 2020 2020 0000 0000 0000 0000 ........
0xc09a~0xc0b7总共占用了30Byte(=3*10)
Compact实例
mysql> CREATE TABLE t (
-> a CHAR(10)
-> ) ENGINE=INNODB CHARSET=UTF8 ROW_FORMAT=REDUNDANT;
Query OK, 0 rows affected (0.02 sec)
mysql> INSERT INTO t SELECT 'a';
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
0000c090: 0110 6120 2020 2020 2020 2020 0000 0000 ..a ....
0xc092~0xc09b总共占用了10Byte(=1*10)
参考资料
- MySQL技术内幕 - InnoDB存储引擎 V2
- File Space Management
- COMPACT and REDUNDANT Row Formats
- Physical Row Structure of InnoDB Tables
- DYNAMIC and COMPRESSED Row Formats
InnoDB -- 行记录格式的更多相关文章
- MySQL InnoDB 行记录格式(ROW_FORMAT)
MySQL InnoDB 行记录格式(ROW_FORMAT) 一.行记录格式的分类和介绍 在早期的InnoDB版本中,由于文件格式只有一种,因此不需要为此文件格式命名.随着InnoDB引擎的发展,开发 ...
- InnoDB行记录格式(compact)、InnoDB数据页结构
1. compact 行记录格式: 变长字段长度列表,null标志位,记录头信息,列1数据,列2数据 …… 记录头信息中包含许多信息,只列举一部分: 名称 大小 描述 deleted_flag 1bi ...
- Innodb物理存储结构系列2 行记录格式
前一篇讨论了Innodb system,表空间,文件的关系及数据结构,这一篇记录下Innodb行记录的格式. 前提: 1. server层和innodb层都有自己对于record的记录格式,需要进行转 ...
- InnoDB的行记录格式, Compact, Redundant, Compressed, Dynamic
InnoDB存储引擎和大多数数据库一样(如Oracle和Microsoft SQL Server数据库),记录是以行的形式存储的.这意味着页中保存着表中一行行的数据.到MySQL 5.1时,InnoD ...
- Innodb行锁源码学习(一)
Innodb是mysql数据库中目前最流行的存储引擎,innodb相对其它存储引擎一个很大的特点是支持事务,并且支持行粒度的锁.今天我重点跟大家分享下innodb行锁实现的基础知识.由于篇幅比较大,文 ...
- Mysql InnoDB行锁实现方式(转)
Mysql InnoDB行锁实现方式 InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的.InnoDB这种行锁实现特点 ...
- Mysql InnoDB行锁实现方式
Mysql InnoDB行锁实现方式 InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的.InnoDB这种行锁实现特点 ...
- 14.9 InnoDB Row Storage and Row Formats InnoDB 行存储和行格式:
14.9 InnoDB Row Storage and Row Formats InnoDB 行存储和行格式: 14.9.1 Overview of InnoDB Row Storage 14.9.2 ...
- InnoDB行格式(compact,redundant)对照
InnoDB行格式分两种格式(COMPACT,redundant)默觉得COMPACT compact的存储格式为 首部为一个非NULL的变长字段长度列表,并且是依照列的顺序逆序放置的,当列的长度小于 ...
随机推荐
- Spring Boot:定时任务与图片压缩处理
一.定时任务 1.创建定时任务 2.@Scheduled 二.图片压缩处理 1.添加thumbnailator依赖 2.创建图片处理类 3.基本使用方法 一.定时任务 项目中可以采用定时任务进行一些操 ...
- hbase远程api调用, 远程连接开发,环境构建相关问题总结
平时在开发的过程中,都是将hbase的环境装在虚拟机或者双系统上的,开发是直接在unix或者linux上进行的,这样对于使用上,有些繁琐. 下面我将介绍我在使用windows远程开发过程中的一些总结: ...
- ODS(Operational Data Store)定义
ODS(Operational Data Store)可操作的数据存储. 很多人对ODS究竟是什么有很多的困惑,ODS对于不同的人可以有不同的看法,我主要说说什么是最主流的定义.首先我们需要注意,OD ...
- C语言实现2048小游戏
目录 2048 一.设计思路 1.游戏规则 2.思路 二.代码实现 1.存储结构 2.初始化游戏数据 3.向左合并 4.其他方向合并 5.产生新的方块 6.源代码 7.实例演示 三.问题 2048 一 ...
- Java工作中的并发问题处理方法总结
Java工作中常见的并发问题处理方法总结 好像挺久没有写博客了,趁着这段时间比较闲,特来总结一下在业务系统开发过程中遇到的并发问题及解决办法,希望能帮到大家 问题复现 1. "设备Aの奇怪分 ...
- P3164 [CQOI2014]和谐矩阵(高斯消元 + bitset)
题意:构造一个$n*m$矩阵 使得每个元素和上下左右的xor值=0 题解:设第一行的每个元素值为未知数 可以依次得到每一行的值 然后把最后一行由题意条件 得到$m$个方程 高斯消元解一下 bitset ...
- Codeforces Round #644 (Div. 3) D. Buying Shovels (数学)
题意:商店里有\(k\)个包裹,第\(i\)个包裹中含有\(i\)个物品,现在想要买\(n\)物品,你可以选择某一个包裹购买任意次,使得物品数刚好等于\(n\),求最少的购买次数. 题解:首先,假如\ ...
- Dapr微服务应用开发系列0:概述
题记:Dapr是什么,Dapr包含什么,为什么要用Dapr. Dapr是什么 Dapr(Distributed Application Runtime),是微软Azure内部创新孵化团队的一个开源项目 ...
- Dapr微服务应用开发系列3:服务调用构件块
题记:这篇开始逐一深入介绍各个构件块,从服务调用开始 原理 所谓服务调用,就是通过这个构件块让你方便的通过HTTP或者gRPC协议同步调用其他服务的方法,这些方法也是通过HTTP或者gRPC来暴露的. ...
- Kubernets二进制安装(12)之部署Node节点服务的kube-Proxy
kube-proxy是Kubernetes的核心组件,部署在每个Node节点上,它是实现Kubernetes Service的通信与负载均衡机制的重要组件; kube-proxy负责为Pod创建代理服 ...