zhangyachen.github.io
zhangyachen.github.io copied to clipboard
MySQL 如何存储长度较大的varchar与blob
æè¿ï¼å¨å·¥ä½ä¸éå°äºMySQLä¸å¦ä½åå¨é¿åº¦è¾é¿çåæ®µç±»åé®é¢ï¼äºæ¯è±äºä¸å¨å¤çæ¶é´æ½ç©ºå¦ä¹ äºä¸ä¸ï¼å¹¶ä¸è®°å½ä¸æ¥ã
MySQL大è´çé»è¾åå¨ç»æå¨è¿ç¯æç« 䏿ä»ç»ï¼åä¸ºåºæ¬æ¦å¿µï¼InnoDB é»è¾åå¨ç»æ
æ³¨ï¼æä¸ææçå¤§æ°æ®æçæ¯é¿åº¦è¾é¿çæ°æ®å段ï¼å æ¬varchar/varbinay/text/blobã
Compactè¡æ ¼å¼
æä»¬é¦å æ¥çä¸ä¸è¡æ ¼å¼ä¸ºCompactæ¯å¦ä½åå¨å¤§æ°æ®çï¼
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.1.73 |
+-----------+
1 row in set (0.01 sec)
mysql> show table status like 'row'\G;
*************************** 1. row ***************************
Name: row
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 1
Avg_row_length: 81920
Data_length: 81920
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: 2017-01-04 21:46:02
Update_time: NULL
Check_time: NULL
Collation: latin1_swedish_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
æä»¬å»ºç«ä¸å¼ æµè¯è¡¨ï¼æå ¥æ°æ®ï¼
CREATE TABLE `row` (
`content` varchar(65532) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=latin1
mysql> insert into row(content) select repeat('a',65532);
Query OK, 1 row affected (0.03 sec)
Records: 1 Duplicates: 0 Warnings: 0
æä»¬ä½¿ç¨py_innodb_page_info.pyå·¥å ·æ¥æ¥ç表ä¸ç页åå¸ï¼
[root@localhost mysql]# python py_innodb_page_info.py -v com/row.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 00000005, page type <Uncompressed BLOB Page>
page offset 00000006, page type <Uncompressed BLOB Page>
page offset 00000007, page type <Uncompressed BLOB Page>
Total number of page: 8:
Insert Buffer Bitmap: 1
Uncompressed BLOB Page: 4
File Space Header: 1
B-tree Node: 1
File Segment inode: 1
å¯ä»¥çåºï¼ç¬¬4页ç<B-tree Node>, page level <0000>æ ¼å¼ä¸ºæ°æ®é¡µï¼åæ¾çMySQLçè¡æ°æ®ã<Uncompressed BLOB Page>å¯ä»¥ç解为MySQLåæ¾å¤§æ°æ®çå°æ¹ï¼æä¸å«ä½å¤é¨åå¨é¡µãCompactæ ¼å¼æ²¡æå°å¤§æ°æ®å
¨é¨æ¾å¨æ°æ®é¡µä¸ï¼èæ¯å°ä¸é¨åæ°æ®æ¾å¨äºå¤é¨åå¨é¡µä¸ãé£ä¹ï¼æ¯å
¨é¨æ°æ®å¨å¤é¨åå¨é¡µä¸ï¼è¿æ¯ä¸é¨åæ°æ®ãå妿¯ä¸é¨åæ°æ®ï¼è¿ä¸é¨åæ¯å¤å°å¢ï¼
æä»¬ä½¿ç¨hexdump -Cv row.ibdæ¥çä¸ä¸æ°æ®é¡µ<B-tree Node>, page level <0000>ï¼ä¹å°±æ¯ç¬¬4页ï¼
3073 0000c000 8c 25 17 57 00 00 00 03 ff ff ff ff ff ff ff ff |.%.W....????????|
3074 0000c010 00 00 00 00 00 07 3a b8 45 bf 00 00 00 00 00 00 |......:?E?......|
3075 0000c020 00 00 00 00 00 02 00 02 03 a6 80 03 00 00 00 00 |.........?......|
3076 0000c030 00 7f 00 05 00 00 00 01 00 00 00 00 00 00 00 00 |................|
3077 0000c040 00 00 00 00 00 00 00 00 00 13 00 00 00 02 00 00 |................|
3078 0000c050 00 02 00 f2 00 00 00 02 00 00 00 02 00 32 01 00 |...?.........2..|
3079 0000c060 02 00 1c 69 6e 66 69 6d 75 6d 00 02 00 0b 00 00 |...infimum......|
3080 0000c070 73 75 70 72 65 6d 75 6d 14 c3 00 00 10 ff f1 00 |supremum.?...??.|
3081 0000c080 00 00 00 04 03 00 00 00 00 13 12 80 00 00 00 2d |...............-|
3082 0000c090 01 10 61 61 61 61 61 61 61 61 61 61 61 61 61 61 |..aaaaaaaaaaaaaa|
3083 0000c0a0 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 |aaaaaaaaaaaaaaaa|
3084 0000c0b0 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 |aaaaaaaaaaaaaaaa|
3085 0000c0c0 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 |aaaaaaaaaaaaaaaa|
....
....
3128 0000c370 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 |aaaaaaaaaaaaaaaa|
3129 0000c380 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 |aaaaaaaaaaaaaaaa|
3130 0000c390 61 61 00 00 00 02 00 00 00 04 00 00 00 26 00 00 |aa...........&..|
3131 0000c3a0 00 00 00 00 fc fc 00 00 00 00 00 00 00 00 00 00 |....??..........|
3132 0000c3b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
3133 0000c3c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
3134 0000c3d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
...
...
4093 0000ffc0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
4094 0000ffd0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
4095 0000ffe0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
4096 0000fff0 00 00 00 00 00 70 00 63 01 a1 6c 2b 00 07 3a b8 |.....p.c.?l+..:?|
æä»¬å¯ä»¥çåºï¼æ°æ®é¡µä¸åå¨äºä¸é¨åæ°æ®ï¼ç®ä¸æ¥ä¸å ±æ¯768åèï¼ç¶åå©ä½é¨ååå¨å¨å¤é¨åå¨é¡µä¸ãé£ä¹æ°æ®é¡µä¸å¤é¨åå¨é¡µãå¤é¨åå¨é¡µä¸å¤é¨åå¨é¡µæ¯å¦ä½è¿æ¥å¨ä¸èµ·çå¢ï¼
æä»¬è§å¯è¿ä¸è¡ï¼
3130 0000c390 61 61 00 00 00 02 00 00 00 04 00 00 00 26 00 00 |aa...........&..|
3131 0000c3a0 00 00 00 00 fc fc 00 00 00 00 00 00 00 00 00 00 |................|
è¿ä¸è¡æ¯åç¼768åèçç»å°¾ã注ææåç20个åèï¼
- 00 00 00 02ï¼4åèï¼ä»£è¡¨å¤é¨åå¨é¡µæå¨çspace id
- 00 00 00 04ï¼4åèï¼ä»£è¡¨ç¬¬ä¸ä¸ªå¤é¨é¡µçPage no
- 00 00 00 26ï¼4åèï¼å¼ä¸º38ï¼æåblob页çheader
- 00 00 00 00 00 00 fc fcï¼8åèï¼ä»£è¡¨è¯¥ååå¨å¤é¨åå¨é¡µçæ»é¿åº¦ãæ¤å¤çå¼ä¸º64764ï¼å ä¸åç¼768æ£å¥½æ¯65532ãï¼æ³¨æä¸ç¹ï¼è½ç¶è¡¨ç¤ºBLOBé¿åº¦çæ¯8åèï¼å®é åªæ4个åèè½ä½¿ç¨ï¼ææå¯¹äºBLOBåæ®µï¼å卿°æ®çæå¤§é¿åº¦ä¸º4GBãï¼
éªè¯ä¸ç¬¬ä¸ä¸ªå¤é¨åå¨é¡µç头é¨ä¿¡æ¯ï¼
4097 00010000 cd c3 b6 8e 00 00 00 04 00 00 00 00 00 00 00 00 |?ö.............|
4098 00010010 00 00 00 00 00 06 b8 a2 00 0a 00 00 00 00 00 00 |......??........|
4099 00010020 00 00 00 00 00 02 00 00 3f ca 00 00 00 05 61 61 |........??....aa|
4100 00010030 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 |aaaaaaaaaaaaaaaa|
...
...
å38个åè为File Header(å ³äºInnoDBæ°æ®é¡µç详ç»ç»æè¯·åè§ãMySQLææ¯å å¹ InnoDBåå¨å¼æã4.4)ï¼è¿ä¸ªç®åæä¸ä¸ï¼
- cd c3 b6 8eï¼4åèï¼è¯¥é¡µçchecksumã
- 00 00 00 04ï¼4åèï¼é¡µåç§»ï¼æ¤é¡µä¸ºè¡¨ç©ºé´ä¸ç第5个页ã
- 00 00 00 00ï¼4åèï¼å½å页çä¸ä¸ä¸ªé¡µãæ¤é¡µä¸º
<Uncompressed BLOB Page>ï¼æä»¥æ²¡æä¸ä¸é¡µã - 00 00 00 00ï¼4åèï¼å½å页çä¸ä¸ä¸ªé¡µãæ¤é¡µä¸º
<Uncompressed BLOB Page>ï¼æä»¥æ²¡æä¸ä¸é¡µã - 00 00 00 00 00 06 b8 a2ï¼8åèï¼è¯¥é¡µæå被修æ¹çæ¥å¿åºåä½ç½®LSNã
- 00 0aï¼2åèï¼é¡µç±»åï¼0x000A代表BLOB页ã
- 00 00 00 00 00 00 00 00ï¼8åèï¼ç¥è¿ã
- 00 00 00 02ï¼é¡µå±äºåªä¸ªè¡¨ç©ºé´ï¼æ¤å¤æè¡¨ç©ºé´çID为2ã
ä¹åæ¯4åèç00 00 3f caï¼è¿éçå¼ä¸º16330ï¼ä»£è¡¨æ¤BLOBé¡µçæææ°æ®çåèæ°ã00 00 00 05代表ä¸ä¸ä¸ªBLOB页çpage numberã
æä»¬çæåä¸ä¸ª<Uncompressed BLOB Page>ï¼ç¬¬8个页ï¼
7169 0001c000 fa 78 9b 27 00 00 00 07 00 00 00 00 00 00 00 00 |?x.'............|
7170 0001c010 00 00 00 00 00 07 3a b8 00 0a 00 00 00 00 00 00 |......:?........|
7171 0001c020 00 00 00 00 00 02 00 00 3d 9e ff ff ff ff 61 61 |........=.????aa|
7172 0001c030 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 |aaaaaaaaaaaaaaaa|
7173 0001c040 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 |aaaaaaaaaaaaaaaa|
...
...
æåä¸é¡µçæææ°æ®å¤§å°ä¸º0x00003d9e=15774ï¼768+16330*3+15774 = 65532åèï¼ç¬¦ååå§æå
¥æ°æ®ç大å°ã
ç±äºè¿æ¯æåä¸ä¸ª<Uncompressed BLOB Page>ï¼æä»¥æåä¸ä¸ä¸ª<Uncompressed BLOB Page>çæé为ff ff ff ffã
ç±æ¤æä»¬å¯ä»¥å¾æ¸
æ°ççåºæ°æ®é¡µä¸BLOB页çè¿æ¥å
³ç³»(å¼ç¨æ·å®æ°æ®åºææ¥ä¸çä¸å¼ å¾)ï¼

æä»¬æ¥åçä¸ä¸ªæ¯è¾æææçä¾åãï¼
CREATE TABLE `testblob` (
`blob1` blob NOT NULL,
`blob2` blob NOT NULL,
`blob3` blob NOT NULL,
`blob4` blob NOT NULL,
`blob5` blob NOT NULL,
`blob6` blob NOT NULL,
`blob7` blob NOT NULL,
`blob8` blob NOT NULL,
`blob9` blob NOT NULL,
`blob10` blob NOT NULL,
`blob11` blob NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
mysql> insert into testblob select repeat('a',1000),repeat('b',1000),repeat('c',1000),repeat('d',1000),repeat('e',1000),repeat('f',1000),repeat('g',1000),repeat('h',1000),repeat('i',1000),repeat('j',1000),repeat('k',1000);
ERROR 1030 (HY000): Got error 139 from storage engine
æä»¬å»ºç«ä¸å¼ æ°è¡¨ï¼æ11个blobåæ®µãç¶ååæ¯ä¸ªåæ®µæå
¥1000åèçæ°æ®ï¼MySQLä¼æç¤ºERROR 1030 (HY000): Got error 139 from storage engineï¼ä»ä¹ææå¢ï¼
InnoDBæ¯ä»¥B+æ æ¥ç»ç»æ°æ®çï¼å妿¯ä¸è¡æ°æ®é½å æ®ä¸æ´ä¸ªPage页ï¼é£ä¹B+æ å°éå为åé¾è¡¨ï¼æä»¥InnoDBè§å®äºä¸ä¸ªPageå¿
é¡»å
å«ä¸¤è¡æ°æ®ãä¹å°±æ¯ä¸è¡æ°æ®åå¨å¨Pageä¸ç大å°å¤§æ¦ä¸º8000åèã
èä¸é¢çä¾åï¼ä¸è¡æ°æ®æ11个1000åèçæ°æ®ï¼Pageå±è¯å®æ¾ä¸ä¸ï¼æä»¥å¨Pageå±çä¸768*11=8448åèï¼å·²ç»è¶
è¿äº8000åèï¼æä»¥MySQLä¼æç¤ºERROR 1030 (HY000): Got error 139 from storage engineãæä»¬å¾è½»æ¾çå®ä¹ä¸ä¸ªåæ®µï¼æ¥åå¨11000个åèï¼ä½æ¯å´æ æ³å°ä»ä»¬åæ11ä¸ªåæ®µæ¥åå¨ï¼æç¹ææï¼
é£ä¹å¦ä½è§£å³ä¸é¢çé®é¢å¢ï¼
- å°è¡æ ¼å¼è½¬ä¸ºæ¥ä¸æ¥è¦è¯´çDynamicæ ¼å¼ãæ¤ç§æ ¼å¼åªç¨20åèæåå¤é¨åå¨ç©ºé´ã
- å°å¤ä¸ªblobåæ®µè½¬ä¸ºä¸ä¸ªblobåæ®µãå¤ä¸ªå段å¯ä»¥ç¨æ°ç»åå¨ï¼ç¶åjson_encodeæå è¿blobã
æä»¬åè¡¨ä¸æå ¥ä¸æ¡ææè®°å½ï¼
mysql> insert into testblob(blob1,blob2,blob3,blob4,blob5,blob6,blob7,blob8,blob9) select repeat('a',8000),repeat('b',8000),repeat('c',8000),repeat('d',8000),repeat('e',8000),repeat('f',8000),repeat('g',8000),repeat('h',8000),repeat('i',8000);
Query OK, 1 row affected (0.12 sec)
Records: 1 Duplicates: 0 Warnings: 0
[root@localhost mysql]# python py_innodb_page_info.py -v com/testblob.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 00000005, page type <Uncompressed BLOB Page>
page offset 00000006, page type <Uncompressed BLOB Page>
page offset 00000007, page type <Uncompressed BLOB Page>
page offset 00000008, page type <Uncompressed BLOB Page>
page offset 00000009, page type <Uncompressed BLOB Page>
page offset 0000000a, page type <Uncompressed BLOB Page>
page offset 0000000b, page type <Uncompressed BLOB Page>
page offset 0000000c, page type <Uncompressed BLOB Page>
Total number of page: 13:
Insert Buffer Bitmap: 1
Uncompressed BLOB Page: 9
File Space Header: 1
B-tree Node: 1
File Segment inode: 1
æä»¬å¯ä»¥çåºè¿ä¸è¡æ°æ®æ9个å¤é¨åå¨é¡µï¼èæä»¬ä¸å ±å°±æå ¥äº9åæ°æ®ï¼æ¯ä¸æ¯å½æ¯ä¸åçæ°æ®å¨page页æ¾ä¸ä¸ï¼é½åç¬ç³è¯·ä¸ä¸ªå¤é¨åå¨é¡µï¼èäºç¸ä¹åä¸å ±äº«å¤é¨åå¨é¡µãæä»¬çä¸ä¸page页çç»æå°±ç¥éäºï¼
3130 0000c390 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 |aaaaaaaaaaaaaaaa|
3131 0000c3a0 61 61 61 61 00 00 00 05 00 00 00 04 00 00 00 26 |aaaa...........&|
...
...
3180 0000c6b0 62 62 62 62 62 62 62 62 00 00 00 05 00 00 00 05 |bbbbbbbb........|
3181 0000c6c0 00 00 00 26 00 00 00 00 00 00 1c 40 63 63 63 63 |...&.......@cccc|
...
...
3229 0000c9c0 63 63 63 63 63 63 63 63 63 63 63 63 00 00 00 05 |cccccccccccc....|
3230 0000c9d0 00 00 00 06 00 00 00 26 00 00 00 00 00 00 1c 40 |.......&.......@|
...
...
æ ¹æ®åé¢çåæï¼æä»¬ç°å¨å¯ä»¥çåºï¼å¤é¨åå¨é¡µæ¯ä¸å ±äº«çï¼å³ä½¿ä¸ä¸ªåçæ°æ®å¤åºä¸ä¸ªåèï¼è¿ä¸ä¸ªåè乿¯ç¬å ä¸ä¸ª16KB空é´ç大å°ï¼è¿å¾æµªè´¹åå¨ç©ºé´ãï¼å½ç¶ï¼è¿å¯¹ç°ä»£è®¡ç®æºå¯è½ä¸æ¯é®é¢ï¼åµåµï¼ã
说äºè¿ä¹å¤ï¼æ»ç»ä¸Compactæ ¼å¼åå¨å¤§æ°æ®ç缺ç¹ï¼
- ç±äºåå¨768åèçåç¼å¨Pageé¡µï¼æä»¥ä¼åå¨è½å®ä¹ä¸ä¸ªå段ï¼åå¨11000åèï¼ä½æ¯ä¸è½å®ä¹11ä¸ªåæ®µï¼æ¯ä¸ªå段åå¨1000åèç"bug"ã
- å¤é¨åå¨é¡µä¸å ±äº«ï¼å³ä½¿å¤ä½ä¸ä¸ªåè乿¯ç¬äº«16KBç页é¢ã
Dynamicè¡æ ¼å¼
æ¥çæä»¬é¦å çä¸ä¸è¡æ ¼å¼ä¸ºDynamicæ¯å¦ä½åå¨å¤§æ°æ®çï¼
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.14 |
+-----------+
1 row in set (0.00 sec)
mysql> show table status like 'row'\G;
*************************** 1. row ***************************
Name: row
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 0
Avg_row_length: 0
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: 2017-01-03 22:45:16
Update_time: NULL
Check_time: NULL
Collation: latin1_swedish_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
å建åcompactæ ¼å¼ä¸æ ·ç表ï¼
CREATE TABLE `row` (
`content` varchar(65532) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=latin1
insert into row(content) select repeat('a',65532);
Query OK, 1 row affected (0.03 sec)
Records: 1 Duplicates: 0 Warnings: 0
çä¸é¡µåå¸ï¼
[root@localhost mysql]# python py_innodb_page_info.py -v row.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 00000005, page type <Uncompressed BLOB Page>
page offset 00000006, page type <Uncompressed BLOB Page>
page offset 00000007, page type <Uncompressed BLOB Page>
page offset 00000008, page type <Uncompressed BLOB Page>
Total number of page: 9:
Insert Buffer Bitmap: 1
Uncompressed BLOB Page: 5
File Space Header: 1
B-tree Node: 1
File Segment inode: 1
第4é¡µæ¯æ°æ®é¡µï¼ç¬¬5-9页æ¯äºè¿å¶é¡µãæä»¬ç´æ¥çç£çä¸ç¬¬4é¡µçæ°æ®ï¼
3073 0000c000 dc 2d b0 f5 00 00 00 03 ff ff ff ff ff ff ff ff |.-..............|
3074 0000c010 00 00 00 00 00 a3 4b 59 45 bf 00 00 00 00 00 00 |......KYE.......|
3075 0000c020 00 00 00 00 00 36 00 02 00 a6 80 03 00 00 00 00 |.....6..........|
3076 0000c030 00 7f 00 05 00 00 00 01 00 00 00 00 00 00 00 00 |................|
3077 0000c040 00 00 00 00 00 00 00 00 00 64 00 00 00 36 00 00 |.........d...6..|
3078 0000c050 00 02 00 f2 00 00 00 36 00 00 00 02 00 32 01 00 |.......6.....2..|
3079 0000c060 02 00 1c 69 6e 66 69 6d 75 6d 00 02 00 0b 00 00 |...infimum......|
3080 0000c070 73 75 70 72 65 6d 75 6d 14 c0 00 00 10 ff f1 00 |supremum........|
3081 0000c080 00 00 00 02 00 00 00 00 00 07 07 a7 00 00 01 1b |................|
3082 0000c090 01 10 00 00 00 36 00 00 00 04 00 00 00 26 00 00 |.....6.......&..|
3083 0000c0a0 00 00 00 00 ff fc 00 00 00 00 00 00 00 00 00 00 |................|
3084 0000c0b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
3085 0000c0c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
3086 0000c0d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
3087 0000c0e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
...
...
...
åCompactæ ¼å¼æçææ¾çä¸åï¼å½å¤§æ°æ®å¨Page页忾ä¸ä¸æ¶ï¼Dynamicè¡æ ¼å¼ä¸ä¼ç768åèå¨Page页ï¼å¹¶ä¸å°å ¨é¨å¤§æ°æ®é½æ¾å¨å¤é¨åå¨é¡µãå ·ä½çæ°æ®é¡µåå¤é¨åå¨é¡µçè¿æ¥å ³ç³»åCompactæ ¼å¼ä¸æ ·ã
æä»¬åççDynamicæ ¼å¼çå¤é¨åå¨é¡µæ¯ä¸æ¯æ¯ä¸ä¸ªåç¬äº«å¤é¨åå¨ç©ºé´ï¼è¿æ¯åCompactæ ¼å¼å®éªè¿ç¨ä¸æ ·ï¼
CREATE TABLE `testblob` (
`blob1` blob NOT NULL,
`blob2` blob NOT NULL,
`blob3` blob NOT NULL,
`blob4` blob NOT NULL,
`blob5` blob NOT NULL,
`blob6` blob NOT NULL,
`blob7` blob NOT NULL,
`blob8` blob NOT NULL,
`blob9` blob NOT NULL,
`blob10` blob NOT NULL,
`blob11` blob NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
mysql> insert into testblob(blob1,blob2,blob3,blob4,blob5,blob6,blob7,blob8,blob9,blob10,blob11) select repeat('a',8000),repeat('b',8000),repeat('c',8000),repeat('d',8000),repeat('e',8000),repeat('f',8000),repeat('g',8000),repeat('h',8000),repeat('i',8000),repeat('j',8000),repeat('k',8000);
Query OK, 1 row affected (0.10 sec)
Records: 1 Duplicates: 0 Warnings: 0
çä¸ä¸å¤é¨åå¨é¡µæ°æ®ï¼
4599 00011f60 61 61 61 61 61 61 61 61 61 61 61 61 61 61 00 00 |aaaaaaaaaaaaaa..|
4600 00011f70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
好çï¼å¯ä»¥ä¸ç¨åä¸çå ¶ä»åçäºï¼Dynamicçå¤é¨åå¨é¡µä¹ä¸æ¯å ±äº«çã
使¯MySQL为ä»ä¹è¦è¿ä¹è®¾è®¡å¢ï¼å¯è½æ¯ä¸ºäºå®ç°ç®åå§ï¼æ²¿çé¾è¡¨éè¿æææ°æ®å¤§å°å°±è½è¯»åblobçå ¨é¨æ°æ®ãåå¦å¤ä¸ªå段çblobæ··å¨ä¸èµ·ï¼å¯è½è®¾è®¡æ´å¤æï¼è¦æ´æ°æ¯ä¸ªå段çåç§»éä¹ç±»çï¼æ´æ°çè¯é¡µæ°æ®ç®¡ç乿¯è¾éº»ç¦ãæçä¸ªäººçæµï¼åµåµã
æ»ç»ä¸Dynamicæ ¼å¼åå¨å¤§æ°æ®çç¹ç¹ï¼
- 彿°æ®é¡µæ¾ä¸ä¸æ¶ï¼MySQLä¼å°å¤§æ°æ®å ¨é¨æ¾å¨å¤é¨åå¨é¡µï¼æ°æ®é¡µåªçæåå¤é¨åå¨é¡µçæéã
- å¤é¨åå¨é¡µä¸å ±äº«ï¼å³ä½¿å¤ä½ä¸ä¸ªåè乿¯ç¬äº«16KBç页é¢ã
ç±äºæè¾å¤çå®éªè¿ç¨ï¼æä»¥æ¾å¾æ¯è¾ä¹±ï¼å»ºè®®çå°è¿ç¯æç« 人èªå·±å®è·µä¸éï¼æ¯ç«èªå·±å¨æä¼æèæ´å¤çé®é¢ä¸ç»èï¼çè§£ç乿¯è¾æ·±å»ï¼åååã
åèèµæï¼http://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html http://mysqlserverteam.com/externally-stored-fields-in-innodb/ https://www.percona.com/blog/2010/02/09/blob-storage-in-innodb/ http://mysql.taobao.org/monthly/2016/02/01/
当真好文章。
@whps 我发现写文章真是有点难,写一篇别人愿意看并且能理解好的文章真是不容易啊。
我先顶下
这个不错
楼主你好,我实践了一下,但是我发现在mac下使用py_innodb_page_info.py工具来查看表中的页分布,没成功,应该说是没找到.ibd文件,请问这个文件默认是放在哪个位置的呢?需要改TABLESPACE_NAME='D:\mysql_data\test\t.ibd'的参数吗?
不错不错!
请问在compress格式中,如果一个行,有5个blob字段,每个字段内容就算只有10个字节,那么要完整读取这一行,至少需要 数据页(1次IO) + 5个off页(五次IO) ? 是这样的吗?
@yaoxingshuai 您是说compact格式吗?
楼主你好,我实践了一下,但是我发现在mac下使用py_innodb_page_info.py工具来查看表中的页分布,没成功,应该说是没找到.ibd文件,请问这个文件默认是放在哪个位置的呢?需要改TABLESPACE_NAME='D:\mysql_data\test\t.ibd'的参数吗?
您可以看一下您配置的Mysql的数据目录位置,他在这个目录中