天天看點

大神養成記,一文講清楚MySQL記錄底層到底是如何存儲的

作者:Civen

MySQL ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????? MySQL ??????????????????????????????????????????????????????????????????????????? ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ??????????????????????????????

????????????????????????????????????????????????????????? MySQL ????????????????????????????????????????????????????????????????????? ????????? ??? ???????????????????????????????????????????????????????????? InnoDB ??? MyISAM ??? Memory ?????????????????????????????????????????? ??????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????????????????????????????????????? ?????? Memory ??????????????????????????????????????????????????????????????????????????????????????????????????? InnoDB ??? MySQL ?????? ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?????????????????????????????? InnoDB ????????????????????????????????????????????????????????????????????????????????????????????????????????? ??????????????????????????????????????????????????????????????????~

InnoDB ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ??????????????????????????????????????? InnoDB ?????????????????????????????????????????????????????????????????????????????????????????????

InnoDB ????????????????????? ?????????????????????????????????????????????????????????????????????????????????????????? InnoDB??????????????? ????????? 16 KB???????????????????????????????????????????????????????????????16KB???????????????????????????????????????????????????16KB ???????????????????????????

1.3 InnoDB?????????

?????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????????? ?????? ???????????? ??? ?????? InnoDB ????????????????????????????????????????????????4?????????????????? ????????? ???????????? Compact ??? Redundant ???

Dynamic ??? Compressed ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????

1.3.1 ????????????????????????

??????????????????????????????????????????????????? ????????? ???

CREATE TABLE ?????? (????????????) ROW_FORMAT=???????????????

ALTER TABLE ?????? ROW_FORMAT=???????????????

??????????????? xiaohaizi ??????????????????????????????????????? record_format_demo ??????????????????????????? ????????? ???

mysql> USE xiaohaizi;

Database changed

mysql> CREATE TABLE record_format_demo (
c1 VARCHAR(10),
c2 VARCHAR(10) NOT NULL,
c3 CHAR(10),
c4 VARCHAR(10)
-> ) CHARSET=ascii ROW_FORMAT=COMPACT;
Query OK, 0 rows affected (0.03 sec)           

????????????????????????????????????????????? ????????? ?????? Compact ???????????????????????????????????????????????????????????? ascii ??? ?????? ascii ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????

mysql> INSERT INTO record_format_demo(c1, c2, c3, c4) VALUES('aaaa', 'bbb', 'cc', 'd'),
('eeee', 'fff', NULL, NULL);
Query OK, 2 rows affected (0.02 sec)
Records: 2 Duplicates: 0 Warnings: 0           

?????????????????????????????????????????????

mysql> SELECT * FROM record_format_demo;
+------+-----+------+------+
| c1 | c2 | c3 | c4 |
+------+-----+------+------+
| aaaa | bbb | cc | d |
| eeee | fff | NULL | NULL |
+------+-----+------+------+
mysql>2 rows in set (0.00 sec)           

??????????????????????????????????????????????????????????????????????????????????????????????????????????????????~

4.3.2 COMPACT?????????

?????????????????????????????????

大神養成記,一文講清楚MySQL記錄底層到底是如何存儲的

??????????????????????????????????????????????????????????????????????????? ????????????????????? ??? ????????????????????? ???????????????????????? ??????????????????????????????????????????

4.3.2.1 ?????????????????????

?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????3??????????????? ???????????? ???????????? ??? NULL????????? ??? ??????????????? ???????????????????????????

????????????????????????

???????????? MySQL ?????????????????????????????????????????? VARCHAR(M) ??? VARBINARY(M) ????????? TEXT ??????????????? BLOB ??? ???????????????????????????????????????????????????????????? ???????????? ???????????????????????????????????????????????????????????????????????? ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????? MySQL ???????????????????????? ?????????????????????????????????????????????????????????

1. ?????????????????????

2. ??????????????????

??? Compact ??????????????? ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

????????? record_format_demo ???????????????????????????????????????????????? record_format_demo ?????? c1 ??? c2 ??? c4 ??? ?????? VARCHAR(10) ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

record_format_demo ????????????????????????????????? ascii ???????????????????????????????????????1????????????????????????????????? ??????????????????????????????????????????????????????

大神養成記,一文講清楚MySQL記錄底層到底是如何存儲的

????????????????????????????????????????????????????????????????????? ???????????????????????? ???????????????????????????????????????????????? (???????????????????????????????????????????????????????????????????????????)???

01 03 04

??????????????????????????? ???????????????????????? ?????????????????????????????????????????????

大神養成記,一文講清楚MySQL記錄底層到底是如何存儲的

???????????????????????? c1 ??? c2 ??? c4 ????????????????????????????????????????????????????????????????????????????????????1??????????????? ??????????????????????????????????????????????????????????????????????????????????????????2??????????????????????????????1?????????2???????????? ??????????????????????????????????????? InnoDB ???????????????????????????????????????????????? W ??? M ??? L ????????????

1. ??????????????????????????????????????????????????????????????????????????? W ?????????????????? SHOW CHARSET ????????????????????? Maxlen ??????????????? utf8 ??????????????? W ?????? 3 ??? gbk ??????????????? W ?????? 2 ??? ascii ??????????????? W ?????? 1 ???

2. ?????????????????? VARCHAR(M) ?????????????????????????????????????????? M ?????????(???????????????????????????)?????????????????? ?????????????????????????????????????????????????????? M??W ???

3. ?????????????????????????????????????????????????????? L ???

??????????????????1???????????????2????????????????????????????????????????????????????????????????????????

?????? M??W <= 255 ???????????????1??????????????????????????????????????????????????????

????????????InnoDB????????????????????????????????????????????????????????????????????????????????????????????????????????? ?????????????????????255???????????????????????????1??????????????????????????????????????????????????????

?????? M??W > 255 ???????????????????????????

?????? L <= 127 ?????????1??????????????????????????????????????????????????????

?????? L > 127 ?????????2??????????????????????????????????????????????????????

InnoDB?????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?????????255???????????????????????????????????????????????????????????????????????????????????????????????????????????? ??????InnoDB???????????????????????????????????????????????????????????????????????????????????????????????????0?????? ??????????????????????????????????????????(?????????????????????????????????127?????????????????????????????????0)??? ?????????????????????????????????1??????????????????????????????????????????

????????????????????????????????????????????????????????????????????????????????????16KB????????????????????????????????? ???????????????????????????InnoDB???????????????????????????????????????????????????(?????????????????????)????????? ???????????????????????????????????????????????????????????????????????????????????????????????????????????????

???????????????????????????????????????????????????????????????????????????( M??W )??????255????????????????????????????????????( L ) ??????127??????????????????2????????????????????????1????????????

????????????????????????????????? ?????????????????????????????????????????? ???NULL ???????????????????????????????????? NULL ??????????????? ??????????????? ??????????????????????????????????????????????????? c4 ???????????? NULL ??????????????????????????? ???????????????????????? ??? ???????????? c1 ??? c2 ??????????????????????????? c1 ?????????????????? 'eeee' ???????????????????????? 4 ??? c2 ???????????????

??? 'fff' ???????????????????????? 3 ????????? 4 ?????????1?????????????????? 3 ????????????1?????????????????????????????? ?????????????????? ?????? ??????2????????????????????? ???????????????????????? ????????????????????????????????????

大神養成記,一文講清楚MySQL記錄底層到底是如何存儲的

????????????

????????????????????????????????? ???????????????????????? ??????????????????????????????????????????????????????????????????????????? ??????????????????????????????

NULL?????????

?????????????????????????????????????????? NULL ????????????????????? NULL ???????????? ????????????????????? ?????????????????????????????? ??? Compact ???????????????????????? NULL ???????????????????????????????????? NULL ????????????????????????????????????????????????

1. ?????????????????????????????? NULL ??????????????????

???????????????????????????????????? NOT NULL ????????????????????????????????? NULL ???????????????????????????????????????????????????

???????????????????????? record_format_demo ???3?????? c1 ??? c3 ??? c4 ?????????????????? NULL ???????????? c2 ????????? NOT NULL ???????????????????????? NULL ??????

2. ?????????????????????????????? NULL ???????????? NULL?????????????????????????????????????????????????????? NULL ?????????????????? ????????????????????????????????????????????????????????????????????????????????????????????????

????????????????????? 1 ??????????????????????????? NULL ???

????????????????????? 0 ?????????????????????????????? NULL ???

????????? record_format_demo ???3??????????????? NULL ??????????????????3????????????????????????????????????????????? ??????

大神養成記,一文講清楚MySQL記錄底層到底是如何存儲的

????????????????????????????????????????????????????????????????????????????????? c1 ????????????????????????????????????

3. MySQL ?????? NULL????????? ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 0 ???

??? record_format_demo ??????3??????????????? NULL ???????????????3???????????????????????????????????????????????????????????? ?????? 0 ????????????????????????

大神養成記,一文講清楚MySQL記錄底層到底是如何存儲的

????????????????????????????????????9???????????? NULL ????????????????????? NULL ????????????????????????2????????????????????????

???????????????????????????????????????????????? record_format_demo ???????????????????????? NULL????????? ?????????????????????????????? ??? c1 ??? c3 ??? c4 ???3?????????????????? NULL ??????????????????????????? NULL????????? ????????????????????????

?????????????????????????????? c1 ??? c3 ??? c4 ???3????????????????????? NULL ?????????????????????????????????????????? 0 ???????????????????????????

大神養成記,一文講清楚MySQL記錄底層到底是如何存儲的

???????????????????????? NULL????????? ?????????????????????????????? 0x00 ???

?????????????????????????????? c1 ??? c3 ??? c4 ???3????????? c3 ??? c4 ???????????? NULL ????????????3?????????????????????????????????????????????

大神養成記,一文講清楚MySQL記錄底層到底是如何存儲的

???????????????????????? NULL????????? ?????????????????????????????? 0x06 ???

????????????????????????????????? NULL????????? ??????????????????????????????

大神養成記,一文講清楚MySQL記錄底層到底是如何存儲的

???????????????

?????? ???????????????????????? ??? NULL????????? ?????????????????????????????????????????? ??????????????? ????????????????????? 5 ???????????? ?????? 5 ?????????????????? 40 ???????????????????????????????????????????????????????????????

大神養成記,一文講清楚MySQL記錄底層到底是如何存儲的

??????????????????????????????

B+??????????????????????????????????????????????????????????????????

????????????????????????????????????

?????????????????????????????????????????????

?????????????????????????????? 0 ????????????????????? 1 ??????B+??????????????????????????? 2 ????????????????????? 3??????????????????

????????????????????????????????????

??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?????????????????????

??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ??????????????????????????????????????? record_format_demo ????????????????????? ????????? ??????????????????

????????????

????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????~

1.3.2.2 ?????????????????????

大神養成記,一文講清楚MySQL記錄底層到底是如何存儲的

????????????

????????????????????????????????????????????????DB_ROW_ID???DB_TRX_ID???DB_ROLL_PTR?????????????????????????????????row _id???transaction_id???roll_pointer???

????????????????????? InnoDB ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ???????????? Unique ????????????????????????????????? Unique ?????????????????????????????? InnoDB ?????????????????????????????????

row_id ?????????????????????????????????????????????????????????????????? InnoDB??????????????????????????????????????? transaction_id ??? roll_pointer ????????????????????? row_id ????????????(??????????????????????????????Unique?????????????????????????????????) ??? ?????????????????????????????????????????? InnoDB ??????????????????????????????????????????

????????? record_format_demo ?????????????????????????????? MySQL ??????????????????????????????????????????3???????????????????????? ?????? ????????????????????? ?????????????????????????????????

大神養成記,一文講清楚MySQL記錄底層到底是如何存儲的

????????????????????????????????????????????????

1. ??? record_format_demo ???????????? ascii ?????????????????? 0x61616161 ?????????????????? 'aaaa' ??? 0x626262 ?????? ???????????? 'bbb' ??????????????????

2. ?????????1???????????? c3 ?????????????????? CHAR(10) ????????????????????????????????????????????? 'cc' ?????? ascii ???????????? ?????????????????? '0x6363' ??????????????????????????????????????????2????????????????????? c3 ??????????????????10??????????????? ??????????????????????????????8???????????????????????????????????????????????????????????? ascii ???????????????????????? 0x20 ???

3. ?????????2???????????? c3 ??? c4 ??????????????? NULL ????????????????????????????????? NULL????????? ????????????????????????????????? ???????????????????????????????????????????????????

4.3.2.3 CHAR(M)??????????????????

record_format_demo ?????? c1 ??? c2 ??? c4 ??????????????? VARCHAR(10) ?????? c3 ??????????????? CHAR(10) ??????????????? Compact ???????????????????????????????????????????????????????????? ???????????????????????? ?????????????????????

大神養成記,一文講清楚MySQL記錄底層到底是如何存儲的

?????????????????????????????? record_format_demo ??????????????? ascii ???????????????????????????????????????????????????????????????

?????????????????????????????????????????????????????????????????????????????????(??????????????????????????????????????????????????????????????? gbk ?????????????????????12???????????? utf8 ?????????????????????13????????????)????????? c3 ?????????????????????????????? ????????????

???????????? ?????????????????????????????? record_format_demo ??????????????????

mysql> ALTER TABLE record_format_demo MODIFY COLUMN c3 CHAR(10) CHARACTER SET utf8; Query OK, 2 rows affected (0.02 sec)
Records: 2 Duplicates: 0 Warnings: 0           

????????????????????????????????? ???????????????????????? ??????????????????????????????

大神養成記,一文講清楚MySQL記錄底層到底是如何存儲的

?????????????????? ?????? CHAR(M) ???????????????????????????????????????????????????????????????????????????????????????????????????????????? ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

??????????????????????????????????????????????????? CHAR(M) ?????????????????????????????? M ??????????????? VARCHAR(M) ?????????????????? ??????????????????????????? utf8 ???????????? CHAR(10) ????????????????????????????????????????????????????????????10 ~ 30??????????????? ????????????????????????????????????????????????????????? 10 ???????????????????????????????????????????????????????????????????????????????????? ???????????????10????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????(???????????????????????? Compact ????????????????????????????????????????????????????????????

CHAR(M) ???????????????????????????????????????????????????)

4.3.3 Redundant?????????

??????????????? Compact ??????????????????????????????????????????????????????????????????????????????????????? Redundant ????????????

MySQL5.0 ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????????????????????????

????????????????????? Redundant ?????????????????????

大神養成記,一文講清楚MySQL記錄底層到底是如何存儲的

?????????????????? record_format_demo ????????????????????? Redundant ???

mysql> ALTER TABLE record_format_demo ROW_FORMAT=Redundant;

Query OK, 0 rows affected (0.05 sec)

Records: 0 Duplicates: 0 Warnings: 0

???????????????????????????????????????????????????????????? record_format_demo ??? Redundant ??????????????????????????????????????? ?????????????????????????????????????????????????????????????????????????????????

大神養成記,一文講清楚MySQL記錄底層到底是如何存儲的

???????????????????????????????????? Redundant ????????????????????????????????????

????????????????????????

?????? Compact ????????????????????? ???????????????????????? ?????? Redundant ????????????????????? ???????????????????????? ?????? ???????????????????????? ??????????????????

???????????????????????????????????? Redundant ??????????????????????????????????????? (?????? ????????? )?????????????????????

?????????????????? ???????????????????????? ???

???????????????????????????????????????????????????????????????????????? Compact ???????????????????????????????????????????????????

?????????????????????????????????????????????

???????????????????????? ???????????????????????? ?????????

25 24 1A 17 13 0C 06

?????????????????????????????????????????????????????????????????????

06 0C 13 17 1A 24 25

?????????????????????????????????????????????????????????????????????????????????

?????????(`row_id`)??????????????? 0x06?????????????????????6????????????

?????????(`transaction_id`)??????????????? (0x0C - 0x06)?????????????????????6???????????? ?????????(`roll_pointer`)??????????????? (0x13 - 0x0C)?????????????????????7???????????? ?????????(`c1`)??????????????? (0x17 - 0x13)?????????????????????4????????????

?????????(`c2`)??????????????? (0x1A - 0x17)?????????????????????3????????????

?????????(`c3`)??????????????? (0x24 - 0x1A)?????????????????????10????????????

?????????(`c4`)??????????????? (0x25 - 0x24)?????????????????????1????????????

???????????????

Redundant ????????????????????????????????? 6 ????????? 48 ????????????????????????????????????????????????????????????

|??????|??????(????????? bit) |??????| |:--:|:--:|:--:| | ?????????1 | 1 |????????????| | ?????????2 | 1 |????????????|

| delete_mask | 1 |??????????????????????????????| | min_rec_mask | 1 |B+?????????????????????????????????????????????????????? ????????????| | n_owned | 4 |????????????????????????????????????| | heap_no | 13 |?????????????????????????????????????????????| | n_field | 10 |???????????????????????????| | 1byte_offs_flag | 1 |??????????????????????????????????????????????????????????????? ??????1????????????2???????????????| | next_record | 16 |????????????????????????????????????|

????????????????????????????????????

00 00 10 0F 00 BC

??????????????????????????????????????????????????????????????????

?????????1???0x00

?????????2???0x00

delete_mask: 0x00

min_rec_mask: 0x00

n_owned: 0x00

heap_no: 0x02

n_field: 0x07

1byte_offs_flag: 0x01

next_record:0xBC

??? Compact ????????????????????????????????????????????????????????????

Redundant ??????????????? n_field ??? 1byte_offs_flag ??????????????????

Redundant ??????????????? record_type ???????????????

1byte_offs_flag ????????????????????????

???????????????????????? ?????????????????????????????????????????????????????? ????????????????????? ??????????????????????????????

record_format_demo ???????????????????????? 0x06 ????????????????????? ????????????????????? ???6????????????????????? 0x0C ??? ?????????????????? ????????????????????? ???12????????????????????? 0x13 ????????????????????? ????????????????????? ???19??????????????? ???????????????????????????????????????????????????????????? 0x25 ???????????????????????????????????? ????????????????????? ???37?????? ????????????????????????????????????????????? ???????????? ??????????????? 37 ????????????

?????????????????????????????????????????????????????????1???????????????2?????????????????????????????????????????????1?????????????????? ?????????2???????????????????????????????????? Redundant ????????? ????????????????????? ?????????????????????????????????

???????????????????????????????????????????????????127 (???????????? 0x7F ???????????? 01111111 )???????????????????????????

????????????1????????????

????????????

??????????????????????????????????????????????????????????????????127??????????????????????????????????????????????????? ??????????????????127?????????????????????1????????????????????????

????????????????????????????????????????????????127???????????????32767 (???????????? 0x7FFF ????????????

0111111111111111 )???????????????????????????????????????2????????????

????????????????????????????????????32767??????????????????????????????????????????????????????????????????????????????????????????

????????? 768 ????????????20??????????????????????????????(?????????20??????????????????????????????????????????)????????? ??? ????????????????????? ????????????????????????????????????????????????????????????????????????????????????2??????????????????????????? ????????????

?????????????????????????????? Redundant ?????????????????????????????????????????????????????????????????? ????????????????????? ?????????????????????1???????????????2???????????????????????????????????????????????????????????????????????????????????????????????? ?????????127???????????????????????????????????????????????????127?????????????????????????????????2?????????????????????????????? ??????????????????????????????????????????????????????(????????????????????????????????????~)???

????????????

?????????????????????????????????????????????????????????0~255????????????????????????????????????????????????????????? ???127????????????2??????????????????????????????????????????????????????????????????????????????

????????????????????????????????????????????????????????????1???????????????2??????????????????????????? Redundant ??????????????? ???????????? ??????????????? ??????????????????????????? 1byte_offs_flag ????????????

???????????????1??????????????????1??????????????????

???????????????0??????????????????2??????????????????

Redundant ???????????? NULL ????????????

?????? Redundant ?????????????????? NULL????????? ??????????????? Redundant ????????????????????? ???????????????????????? ?????? ?????????????????????????????????????????????????????? ?????? ??????????????????????????????????????????????????????????????? NULL ?????? ??????????????????????????????????????? NULL????????? ???????????????????????????????????????????????????????????????????????????????????? ???????????? NULL????????? ???????????? 1 ???????????? 1 ??????????????????????????? NULL ??????????????? NULL ???

????????????????????????????????????????????????????????????????????????127 (???????????? 0x7F ???????????? 01111111 )???????????? ???2??????????????????????????????????????????????????????????????????????????????????????? NULL????????? ????????????????????????????????? ??? NULL ???

?????????????????????????????????????????? NULL ???????????????????????????????????????????????????????????? NULL ????????????????????? ????????????????????????????????? record_format_demo ???????????????????????????????????? ???????????????????????? ?????????

A4 A4 1A 17 13 0C 06

?????????????????????????????????

06 0C 13 17 1A A4 A4

???????????????????????????

???????????? NULL ?????????????????????????????????????????? CHAR(M) ????????????????????? NULL ??????????????????????????????

??????????????????????????????????????????????????? 0x00 ???????????????

???????????????????????? c3 ???????????? NULL ?????? c3 ??????????????? CHAR(10) ????????????????????????????????????10??? ??????????????????????????? Redundant ?????????????????? 0x00000000000000000000 ????????? NULL ??????

????????? c3 ???????????????????????? 0xA4 ???????????????????????????????????? 10100100 ??????????????????????????? 1 ????????? ?????????????????? NULL ??????????????????????????????????????? 0100100 ??????????????????????????? 36 ?????? c2 ??????????????? ????????? 0x1A ???????????????????????? 26 ??? 36 - 26 = 10 ????????????????????? c3 ???????????????????????????10????????????

??????????????? NULL ???????????????????????????????????????????????? ????????????????????? ??????????????????????????????

?????? record_format_demo ?????? c4 ?????? VARCHAR(10) ???????????? VARCHAR(10) ??????????????????????????????

c4 ???????????????????????? 0xA4 ?????? c3 ??????????????????????????????????????????????????????????????? NULL ?????? 0xA4 ???????????????????????????????????????????????? 36 ??? 36 - 36 = 0 ?????????????????? c4 ???????????????????????? ???????????? ????????? ???????????????

?????????????????????????????? Redundant ???????????? Compact ?????????????????????????????????

1.3.3.1 CHAR(M)??????????????????

???????????? Compact ???????????? CHAR(M) ??????????????????????????????????????????????????????????????????????????????????????????????????? ?????? Redundant ????????????????????????????????????????????????????????????????????????????????? CHAR(M) ????????????????????????????????? ?????????????????????????????????????????????????????????????????? M ??????????????????????????? utf8 ???????????? CHAR(10) ??????????????? ????????????????????????????????? 30 ?????????????????? gbk ???????????? CHAR(10) ???????????????????????????????????????????????? 20 ?????? ???????????????????????????????????? Redundant ???????????? CHAR(M) ???????????????????????????????????????

1.3.4 ???????????????

1.3.4.1 VARCHAR(M)????????????????????????

?????????????????? VARCHAR(M) ?????????????????????????????? 65535 ????????????????????? M ???????????????????????????????????????????????? ??????????????? ascii ?????????????????????????????????????????????????????????????????? VARCHAR(65535) ???????????????

mysql> CREATE TABLE varchar_size_demo(
-> c VARCHAR(65535)
-> ) CHARSET=ascii ROW_FORMAT=Compact;
mysql>ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to c
hange some columns to TEXT or BLOBs           

????????????????????????????????? MySQL ?????????????????????????????????????????????????????????????????? BLOB ?????? TEXT ??????????????? ????????????????????????(????????????????????????????????????)?????????????????????????????????????????? 65535 ?????????????????? MySQL ??? ??????????????????????????????????????? TEXT ?????? BLOB ?????????????????? 65535 ????????????????????????????????????????????????????????? ???????????????( storage overhead )???????????????????????????????????? VARCHAR(M) ?????????????????????????????????3???????????? ?????????

????????????

?????????????????????????????????

NULL ??????????????????????????? NOT NULL ??????????????????????????????????????????

????????? VARCHAR ?????????????????? NOT NULL ?????????????????????????????? 65532 ?????????????????????????????????????????????????????? ??????2???????????? NULL ?????????????????????1????????????

mysql> CREATE TABLE varchar_size_demo(
-> c VARCHAR(65532)
-> ) CHARSET=ascii ROW_FORMAT=Compact;
Query OK, 0 rows affected (0.02 sec)           

?????? VARCHAR ??????????????? NOT NULL ?????????????????????????????? 65533 ???????????????????????????????????????????????????????????? 2????????????????????? NULL ????????????

mysql> DROP TABLE varchar_size_demo;
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE TABLE varchar_size_demo(
-> c VARCHAR(65533) NOT NULL
-> ) CHARSET=ascii ROW_FORMAT=Compact;
Query OK, 0 rows affected (0.02 sec)           

?????? VARCHAR(M) ??????????????????????????? ascii ????????????????????????????????????????????????

mysql> DROP TABLE varchar_size_demo;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE varchar_size_demo(
-> c VARCHAR(65532)
-> ) CHARSET=gbk ROW_FORMAT=Compact;
ERROR 1074 (42000): Column length too big for column 'c' (max = 32767); use BLOB or TEXT i nstead
mysql> CREATE TABLE varchar_size_demo(
-> c VARCHAR(65532)
-> ) CHARSET=utf8 ROW_FORMAT=Compact;
ERROR 1074 (42000): Column length too big for column 'c' (max = 21845); use BLOB or TEXT i nstead           

??????????????????????????????????????? VARCHAR(M) ??????????????????????????? ascii ??????????????? M ???????????????????????????????????? ?????????????????????????????????????????????????????????????????? NULL ??????????????? gbk ??????????????????????????????????????? 2 ?????? ?????????????????????????????? M ????????????????????? 32766 (???????????? 65532/2)?????????????????????????????? 32766 ????????????

utf8 ??????????????????????????????????????? 3 ???????????????????????????????????? M ????????????????????? 21844 ??????????????????????????? 21844 (???????????? 65532/3)????????????

????????????

?????????????????????????????????NULL???????????????gbk????????????M?????????????????????32766???utf8????????????M???????????? ?????????21844???????????????????????????????????????????????????????????????????????????????????????????????????(??????????????? ?????????????????????)??????????????????????????????????????????65535????????????

1.3.4.2 ???????????????????????????????????????

????????? ascii ??????????????? varchar_size_demo ?????????????????????????????????

mysql> CREATE TABLE varchar_size_demo(
-> c VARCHAR(65532)
-> ) CHARSET=ascii ROW_FORMAT=Compact;
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO varchar_size_demo(c) VALUES(REPEAT('a', 65532));
Query OK, 1 row affected (0.00 sec)           

????????? REPEAT('a', 65532) ?????????????????????????????????????????????????????? 'a' ?????? 65532 ???????????????????????????

?????? MySQL ?????????????????????????????????????????? ??? ??????????????? MySQL ?????? ??? ???????????????????????????????????????????????? ????????????????????????????????? ??? ?????????????????????????????????????????? 16KB ???????????? 16384 ?????????????????? VARCHAR(M) ??? ?????????????????????????????? 65532 ????????????????????????????????????????????????????????????????????????????????????

??? Compact ??? Reduntant ???????????????????????????????????????????????????????????? ????????????????????? ?????????????????????????????? ??????????????????????????????????????????????????????????????????????????? ????????????????????? ??????20??????????????????????????????????????? (?????????20?????????????????????????????????????????????????????????????????????????????????)???????????????????????????????????????????????? ???????????????

大神養成記,一文講清楚MySQL記錄底層到底是如何存儲的

????????????????????????????????? Compact ??? Reduntant ???????????????????????????????????????????????????????????????????????????????????? ????????????????????????????????? 768 ???????????????????????????????????????????????????????????????????????????????????????????????????????????? ??????????????? ????????? ??????????????? 768 ????????????????????????????????? ????????? ?????????????????????????????????

大神養成記,一文講清楚MySQL記錄底層到底是如何存儲的

??????????????????????????? ????????? VARCHAR(M) ???????????????????????? TEXT???BLOB ????????????????????????????????????????????? ???????????? ????????? ???

1.3.4.3 ?????????????????????

????????? ????????? ??????????????????????????????????????????????????????????????????????????????????????? ????????? ???

MySQL ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?????????????????? varchar_size_demo ?????????????????????????????? c ????????????????????????????????????????????????????????????????????? ??????????????????????????? ????????? ????????????????????????????????????????????????????????????????????????

?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 136 ????????? ?????????(???????????????????????????????????????)???????????????????????????????????????????????????

???????????????????????????????????? 27 ?????????

???27????????????????????????????????????

2??????????????????????????????????????????

1?????????????????????????????????NULL???

5???????????????????????????

6???????????? row_id ???

6???????????? transaction_id ???

7???????????? roll_pointer ???

?????????????????????????????????????????????n??????????????? ????????? ????????????????????????????????????

136 + 2??(27 + n) > 16384

???????????????????????????????????? n > 8098 ????????????????????????????????????????????????????????? 8098 ??????????????????????????????

????????? ????????????????????? ????????? ??????????????? 8098 ???????????????????????????????????????????????? varchar_size_demo ?????? ???????????????????????????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????? ??????????????????????????????????????????????????????????????????????????????????????? ????????? ????????????

1.3.5 Dynamic???Compressed?????????

??????????????????????????????????????? Dynamic ??? Compressed ?????????????????????????????? MySQL ????????? 5.7 ????????????????????? ????????? Dynamic ????????????????????? Compact ???????????????????????????????????? ????????? ????????????????????????????????????????????? ??????????????????????????????????????????????????? 768 ?????????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????

大神養成記,一文講清楚MySQL記錄底層到底是如何存儲的

Compressed ???????????? Dynamic ????????????????????? Compressed ??????????????????????????????????????????????????????????????????

??????

1.4 ??????

1. ?????? MySQL ???????????????????????????????????????????????? MySQL ???????????????????????????????????????

2. ??????????????????????????????????????????

CREATE TABLE ?????? (????????????) ROW_FORMAT=???????????????

ALTER TABLE ?????? ROW_FORMAT=???????????????

3. InnoDB ???????????????4????????????

COMPACT?????????

?????????????????????

大神養成記,一文講清楚MySQL記錄底層到底是如何存儲的

Redundant?????????

?????????????????????

大神養成記,一文講清楚MySQL記錄底層到底是如何存儲的

Dynamic???Compressed?????????

??????????????????????????? COMPACT????????? ??????????????????????????????????????????????????????????????????????????????????????? ??????????????????????????????768??????????????????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????

????????? Compressed ??????????????????????????????????????????????????????

4. ?????????????????? 16KB ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ???????????? ????????? ???

繼續閱讀