æ¬æå享èªå为äºç¤¾åºãMySQLçvarcharæ°´çç太深äºââInnoDBè®°å½åå¨ç»æ-äºç¤¾åº-å为äºãï¼ä½è ï¼ç ä¸æ´__ ã
1. InnoDBæ¯å¹²åçï¼
InnoDBæ¯ä¸ä¸ªå°è¡¨ä¸çæ°æ®åå¨å°ç£çä¸çåå¨å¼æã
2. InnoDBæ¯å¦ä½è¯»åæ°æ®çï¼
InnoDBå¤çæ°æ®çè¿ç¨æ¯åçå¨å åä¸çï¼éè¦æç£çä¸çæ°æ®å è½½å°å åä¸ï¼å¦ææ¯å¤çåå ¥æä¿®æ¹è¯·æ±çè¯ï¼è¿éè¦æå åä¸çå 容å·æ°å°ç£çä¸ã
读åç£ççé度éå¸¸æ ¢ï¼åå å读åå·®äºå 个æ°é级ï¼æ以å½æ们æ³ä»è¡¨ä¸è·åæäºè®°å½æ¶ï¼InnoDBåå¨å¼æå°æ°æ®åå为è¥å¹²ä¸ªé¡µï¼ä»¥é¡µä½ä¸ºç£çåå åä¹é´äº¤äºçåºæ¬åä½ï¼InnoDBä¸é¡µç大å°é»è®¤ä¸º 16 KBãä¹å°±æ¯å¨ä¸è¬æ åµä¸ï¼ä¸æ¬¡æå°ä»ç£çä¸è¯»å16KBçå 容å°å åä¸ï¼æè ä¸æ¬¡æå°æå åä¸ç16KBå 容å·æ°å°ç£çä¸ã
æ以å½ä½ ç¨postmanæµè¯ä¸ä¸ªHTTPå页æ¥è¯¢æ¥å£ï¼æ¯é¡µ10æ¡æ°æ®ï¼æ¶ï¼åç°ç¬¬ä¸æ¬¡æå°èæ¶300 ~ 400msï¼å¾åä¸åçæ¥æ¾ä¸ä¸é¡µ10æ¡æ°æ®æ¶é½æ¯30 ~ 40msï¼åå å°±æ¯ç¬¬ä¸æ¬¡è¯·æ±æ¥å£æ¶ï¼è¯»æ°æ®åºçæ¶åéè¦è¯»ç£çï¼ä»ç£çå è½½16KBçæ°æ®å°å åï¼å¾åHTTP请æ±æ¯æ¬¡æ¥10æ¡æ°æ®çæ¶åé½æ¯ä»å åä¸è·åï¼æ²¡æå读ç£çï¼é¤éå¨å åä¸ç16KBçæ°æ®ä¸æ¾ä¸å°ï¼æä¼å次读ç£çè·åä¸ä¸ä¸ª16KBçæ°æ®å°å åä¸ãï¼æ们ä¸è®¨è®ºmysql 8.0èå¼çæ¥è¯¢ç¼åç¹æ§ï¼ææµè¯è¿mysql 5.7ä¸å ³éäºæ¥è¯¢ç¼åï¼ä¹ä»ç¶æ¯ç¬¬ä¸æ¬¡æ ¢ï¼åç»æ¥è¯¢å¾å¿«ï¼æ¥è¯¢æ¶é´ç¸å·®å¤§æ¦10åçæ ·åï¼
温馨æ示ï¼å页æ¥è¯¢åæ°æ®åºçä¸é¡µ16KBä¸ç"页"æ¯ä¸¤ä¸ªæ¦å¿µã
æ»ç»ï¼ç±äºç£çI/Oé度ç¸å¯¹å åæ¥è¯´è¾æ ¢ï¼å æ¤ç¬¬ä¸æ¬¡æ¥è¯¢å¯è½ä¼æ¯è¾èæ¶ãä¸æ¦æ°æ®è¢«å è½½å°å åä¸ï¼åç»çæ¥è¯¢å°±å¯ä»¥ç´æ¥ä»å åä¸è¯»åæ°æ®ï¼è¿æ ·çé度è¦æ¯ä»ç£ç读åæ°æ®å¿«å¾å¤ãè¿å°±è§£éäºä¸ºä»ä¹ç¬¬ä¸æ¬¡æ¥è¯¢å¯è½ä¼æ¯åç»çæ¥è¯¢æ ¢ã
æ¥çç£çåå åä¹é´è¿è¡æ°æ®äº¤æ¢ç页æå¤å¤§
注æï¼innodb_page_sizeåéå¨æå¡å¨è¿è¡è¿ç¨ä¸ä¸å¯ä»¥æ´æ¹ï¼åªè½å¨ç¬¬ä¸æ¬¡åå§åMySQLæ°æ®ç®å½æ¶æå®ãæ以页å¨è¿è¡æ¶ç大å°ä¸å¯æ´æ¹ã
3. varcharçé®ååä¸ââInnoDBè¡æ ¼å¼
çå°è¿éï¼ä½ ä¸å®æçåæç¸åççé®ï¼æ¯å¦varchar(255)åé¢è¿ä¸ªæ大é¿åº¦åºè¯¥æä¹éæ©å¢ï¼ä¸ºä»ä¹ä¸è½varchar(65535)èæ大åªè½varchar(16383)å¢ï¼ææ¥å¸¦ä½ çï¼
æ们平æ¶æ¯ä»¥è®°å½ä¸ºåä½æ¥å表ä¸æå ¥æ°æ®çï¼è¿äºè®°å½å¨ç£çä¸çåæ¾æ¹å¼ä¹è¢«ç§°ä¸ºè¡æ ¼å¼æè è®°å½æ ¼å¼ãè¡æ ¼å¼æ4ç§ï¼åå«æ¯DynamicãCompactãRedundantåCompressed
MySQL 5+é»è®¤è¡æ ¼å¼é½æ¯Dynamicï¼ å¨MySQL 5 å MySQL 8ç»è¿éªè¯ç¡®å®æ¯çã
SHOW VARIABLES LIKE "innodb_default_row_format"
大家å¨ä¸å¡ä¸åå¹³æ¶ä½¿ç¨ä¸é½å ä¹æ²¡æä¿®æ¹è¿æè 注æè¿InnoDBè¡æ ¼å¼ï¼é£ä¹æå°±åªéç¹è®²é»è®¤è¡æ ¼å¼dynamicï¼è®©å¤§å®¶æ´æ·±å±æ¬¡ç解平æ¶å¼åä¸çvarcharã
请记ä½è¿ä¸ªè¡¨ç»æï¼åé¢ä¼å´ç»è¿ä¸ªæ¥è®²
CREATE TABLE test (
c1 VARCHAR(10),
c2 VARCHAR(10) NOT NULL,
c3 CHAR(10),
c4 VARCHAR(10)) CHARSET = utf8mb4;
ç°å¨ä¸å¡æ°æ®åºå符éé½æ¯utf8mb4ï¼æ就以è¿ä¸ªæ¥è®²ï¼æç解é¾åº¦éå°æä½ã
INSERT INTO test ( c1, c2, c3, c4 )
VALUES('aaaa', 'ä½ å¥½å', 'cc', 'd'),('eeee', 'fff', NULL, NULL);
ç°å¨ï¼è¡¨ä¸çè®°å½å°±æ¯è¿æ ·
3.1 dynamicââinnodbé»è®¤è¡æ ¼å¼
å ³äºè®°å½çé¢å¤ä¿¡æ¯è¿é¨åï¼æ¯æå¡å¨ä¸ºäºæè¿°è¿æ¡è®°å½èä¸å¾ä¸é¢å¤æ·»å çä¸äºä¿¡æ¯ï¼è¿äºé¢å¤ä¿¡æ¯å为3ç±»ï¼åå«æ¯åé¿å段é¿åº¦å表ãNULLå¼å表åè®°å½å¤´ä¿¡æ¯ã
å¨è¿éæåªè®²åé¿å段é¿åº¦å表ãNULLå¼å表ãå 为记å½å¤´ä¿¡æ¯é常çç»åæ¬ç¯æ²¡å¤å¤§å ³ç³»ã
3.2 innodbæä¹ç¥évarcharçæ£æå¤é¿ï¼ââåé¿å段é¿åº¦å表
ä¸äºåé¿çæ°æ®ç±»åï¼æ¯å¦VARCHAR(M)ãåç§TEXTç±»åï¼åç§BLOBç±»åï¼åé¿æ°æ®ç±»åçå段ä¸åå¨å¤å°åèçæ°æ®æ¯ä¸åºå®çï¼å¨åå¨çå®æ°æ®çæ¶åéè¦æè¿äºæ°æ®å ç¨çåèæ°ä¹åèµ·æ¥ã
å°±å设计Stringç±»åï¼ä¸ä» ä» æ¯åæ¾çå®æ°æ®çcharæ°ç»ï¼è¿ælengthåéå»è®°å½å符串é¿åº¦ãåæ¯å¦inputè¾å ¥æ¡æ大éå¶500åï¼ä½æ¯ä½ è¿å¾æä¸ä¸ªåéå»ç»è®¡çå®å¨è¾å ¥æ¡å æå¤å°å符ãåçï¼varcharä¹æè®°å½çå®æ°æ®é¿åº¦çåéï¼å设为Lï¼åæ沿ç¨æ¹ä¾¿æè¿°ï¼ï¼L表示varcharçå®å ç¨çåèæ°ï¼innodbæå¤åé 2个åèå»è¡¨ç¤ºè¿ä¸ªLï¼å°±åunsigned shortç±»åï¼2个åèï¼å¯åå¨æå¤åªæ16ä½æ¥è®©ä½ åè¿ä¸ªé¿åº¦ï¼æ以Lè®°å½èå´æ¯2^16 - 1 = 65535ã
è¿äºåé¿å段(æ¯å¦varchar)å ç¨çåå¨ç©ºé´å为两é¨åï¼
çæ£çæ°æ®å 容é¨åï¼æ¾å¨å¯¹åºçå
çå®å ç¨çåèæ°ï¼æ¾å¨åé¿å段å表é¨å
æ们æ¿test表ä¸ç第ä¸æ¡è®°å½æ¥ä¸¾ä¸ªä¾åãå 为test表çc1ãc2ãc4åé½æ¯VARCHAR(10)ç±»åçï¼è¯´ææ大10个å符ï¼æ以è¿ä¸ä¸ªåçå¼çé¿åº¦é½éè¦ä¿åå¨è®°å½å¼å¤´å¤ï¼å 为test表ä¸çå个åé½ä½¿ç¨çæ¯utf8mb4å符éï¼æ¯ä¸ªå符æ大éè¦4个åèæ¥è¿è¡ç¼ç ï¼ä¸ä½¿ç¨utf8èæ¯utf8mb4æ¯å 为å¯è½åå¨emoji表æ ï¼å¦æåªæ¯æåï¼utf8就足å¤ï¼ï¼æ¥çä¸ä¸ç¬¬ä¸æ¡è®°å½ååé¿å段å 容çé¿åº¦ï¼
æä¹ç¡®å®è¿äºå段æå¤å°åèï¼
æ¯å¦è¿éc2ç"ä½ å¥½å"ï¼ä½¿ç¨å¦ä¸sqlå¯ä»¥ç¡®å®
SELECT LENGTH(c2) from test where c1='aaaa';
ååé¿å段æ°æ®å ç¨çåèæ°æç §åç顺åºéåºåæ¾ï¼ï¼
ç±äºç¬¬ä¸è¡è®°å½ä¸c1ãc2ãc4åä¸çå符串é½æ¯è¾çï¼ä¹å°±æ¯è¯´varcharçå®å ç¨çåèæ°æ¯è¾å°ï¼Lç¨1个åè(8个bitä½) å°±å¯ä»¥è¡¨ç¤ºï¼ä½æ¯å¦ævarcharçå®å ç¨çåèæ°æ¯è¾å¤ï¼Lå¯è½å°±éè¦ç¨2个åè(16个bitä½) æ¥è¡¨ç¤ºãå°åºvarcharè½åå¤å°åèå¢ï¼ç»§ç»å¾ä¸çã
3.3 varchar(M) è½åå¤å°ä¸ªå符ï¼ä¸ºä»ä¹æ示æ大16383ï¼
é¦å è¦ç解varchar(M)çMæ¯è¯´å符个æ°ï¼èä¸æ¯åèã
为ä»ä¹ä¸è½varchar(20000)ä¹ç±»çï¼æ¯20000个å符æ¾ä¸ä¸åï¼
为ä»ä¹æ示åªè½æ大16383个å符å¢ï¼è¿ä¸ªæ°åæ¯æä¹ç®åºæ¥çï¼
è¿ä¸ªæå°±å¾åä½ å¥½å¥½å åäºï¼
varcharæ¯åé¿çï¼varchar(64) è½åæ¾0~64个å符ä¸çï¼å¹¶ä¸ä¸å®æ¯åäºæ大64个å符ï¼è°ç¥éè¿ä¸ªç±»åå°åºåäºå 个å符å¢ï¼innodb设计çæ¶åï¼å°±å·²ç»èèå°äºï¼ä¸è¿æ¯ç¨åèä½ä¸ºåä½ï¼åç»æ们å¯ä»¥æ ¹æ®å¯¹åºå符é转å为å符æ¥ç解ï¼innodbå¿ é¡»è®°å½åé¿å段varcharçå®å ç¨çåèæ°Lãåé¢è¯´è¿äºï¼innodbæå¤åé 2个åè(16个bitä½)ç空é´å»è®°å½è¿ä¸ªLã
InnoDBæå®çä¸å¥è§åï¼æ们å¼å ¥WãMåLè¿å 个符å·ï¼
å设æ个å符éä¸æå¤éè¦Wåèæ¥è¡¨ç¤ºä¸ä¸ªå符
utf8mb4å符éä¸çWå°±æ¯4
utf8å符éä¸Wå°±æ¯3
gbkå符éä¸çWå°±æ¯2
asciiå符éä¸çWå°±æ¯1ã
对äºåé¿ç±»åVARCHAR(M)æ¥è¯´ï¼è¿ç§ç±»å表示è½åå¨æå¤M个å符ï¼æ³¨ææ¯å符ä¸æ¯åèï¼æ以è¿ä¸ªç±»åè½è¡¨ç¤ºçå符串æå¤å ç¨çåèæ°å°±æ¯M à Wã
å设å®å®é åå¨çå符串å ç¨çåèæ°æ¯Lã
æ¥çæéè¾¹çæ åµï¼innodb为äºè®°å½ä¸ä¸varcharçå®åå¨å¤å°ä¸ªåèï¼æå¤åé 2个åèç空é´å»è®°å½ï¼2个åè16个æ¯ç¹ä½ï¼å ¨é¨ä¸º1ï¼æ大è½è®°å½çæ°åæ¯2^16-1æ¯65535个ï¼innodbæ大è½è®°å½varcharå ç¨çåèæ°å°±æ¯65535个ï¼utf8mb4å符éä¸ä¸ªå符æ¯æ大æ¯4个åèï¼65535 / 4 = 16383.75ï¼åªè¦varcharå符æ°ä¸è¶ è¿16383个ï¼innodbå°±å¯ä»¥è®°å½çå®å ç¨çé¿åº¦Lï¼åå¤å°±è®°å½ä¸äºäºï¼æ以就è½è§£éååçå¾äºï¼varchar(20000)ä¸è¡ï¼æ大ä¹å°±16383个å符
ä½æ¯ï¼è¿é强è°æ¯æä½æ¯çï¼
è¡æ大é¿åº¦æ¯65535åèï¼è¡éé¢æå¾å¤ä¸è¥¿ï¼å æ¬åé¿å段å表ãNULLå¼å表ãè®°å½å¤´ä¿¡æ¯ãä½ å¾èè该å段å¦æå 许为NULLï¼NULLå¼å表ä¼å ç¨ä¸ä¸ªåè(åªè¦æ²¡è¶ è¿8个å段)ï¼æ¯ä¸åå段çåé¿å段å®é é¿åº¦ä¼è±è´¹1~2个åèï¼å¦æ该å段çæ°æ®å¤ªå¤§ï¼ä¼åæ溢åºåï¼è¯¥å段çæ°æ®ä¼åæå¾å¤è¡åå¨ï¼åé¢ä¼è®²ï¼ä½ å¯ä»¥çå®NULLå¼å表å溢åºååååæ¥çè¿ä¸ªä¾åï¼ãæ以å³ä¾¿æ示16383个å符ï¼ä½ ä¹ç»å¯¹ä¸å¯è½åå°16383ã
æåäºä¸ªæµè¯
create table t2 ( name varchar(16383))charset=utf8mb4;
ä¸æå¾è¿ä¸ªå段添å å符ä¿åæµè¯ï¼æååç°ï¼è¿äºå符æ»é¿åº¦å°æéä¹å°±æ¯48545åèã
å¦æè¶ è¿å°±ä¼æ¥é
è¿é48545个åèï¼åå¤ä¸ä¸ªå符就ä¼æ¥éï¼è¿ä¸å°65535åèï¼å·®äº1Wå¤åèã主è¦æ¯å 为溢åºåçåå ï¼æ°æ®åæ£å¨ä¸åçè¡ä¸ï¼æ以ï¼å¾é¿çæ°æ®ï¼å»ºè®®å¾textç±»åèèãè¿ä¸ªç°è±¡å¯ä»¥çåºï¼varchar(M)çMå¾å¤§ï¼å®é æ¯è¾¾ä¸å°Mè¿ä¸ªè¾¹çå¼çã
æ使ç¨çæ¯è±æåæ¯æµè¯èä¸æ¯ä¸æå符ï¼å¤§é¨åä¸æ¯4åèçï¼æ以è½å¤åå¨æ´å¤çå符ãå¦æèèå°é¢å¤çå æ°æ®ï¼å®é è½å¤åå¨çVARCHARå符æ°ä¼æ´å°ï¼å ³äºå½±åæ¯è¡çå®é å¯ç¨ç©ºé´æåªäºå ç´ ï¼è¯·æ¥çå¾ä¸çåé¢å°èã
ä¸é¢è¯´æä¸ä¸è§å(讲解ä¸å符éç¨utf8mb4ï¼W=4)
è§åä¸ï¼å¦æå 许åå¨çæ大åèæ°M à W <= 255ï¼varcharå ç¨ççå®åèæ°Låªåé 1个åèæ¥è¡¨ç¤ºã
æ人说ï¼å 许åå¨çæ大åèæ°M à W <= 255ï¼å³å 许åå¨çæ大åç¬¦æ° <= â255 / 4â = 63个æ¶ï¼varcharå ç¨ççå®åèæ°Lä» åé 1个åèå°±è½è¡¨ç¤ºãè¿ä¸ªç»è®ºæ£ç¡®åï¼ââæ¾ç¶é误ï¼å 为è¿é255 / 4ï¼ä½ æä¹ç¥éæ¯ä¸ªåå¨çä¸ä¸ªå符æ¯4个åèå¢ï¼é¾éå ¨é¨åçemoji表æ ï¼ä¸ååæ¯æ±åå¥çï¼
å®é ä¸ä¸æ¯ææçå符é½ä¼å ç¨W个åèãä¾å¦ï¼å¨utf8mb4å符éä¸ï¼ä¸ä¸ªè±æåæ¯åªå ç¨1个åèï¼èä¸ä¸ªemoji表æ 符å·ä¼å ç¨4个åèãå æ¤ï¼âæå¤M个å符â并ä¸æå³çæ»æ¯éè¦M à W个åèãââInnoDBå¨è¯»è®°å½çåé¿å段é¿åº¦å表æ¶å æ¥ç表ç»æï¼å¦ææ个åé¿å段å 许åå¨çæ大åèæ°ä¸å¤§äº255æ¶ï¼åªç¨1个åèæ¥è¡¨ç¤ºçå®æ°æ®å ç¨çåèã
è§åäºï¼å¦æå 许åå¨çæ大åèæ°M à W > 255ï¼åå为两ç§æ åµï¼
å¦æå®é åå¨åèL <= 127ï¼varcharå ç¨ççå®åèæ°Lä» åé 1个åèå°±è½è¡¨ç¤ºã(â ⦠â表示åä¸åæ´)
æ人说ï¼å®é åå¨åèL <= 127ï¼å³å®é åå¨å符 <= â127 / 4â = 31个æ¶ï¼varcharå ç¨ççå®åèæ°Lä» åé 1个åèå°±è½è¡¨ç¤ºãè¿ä¸ªç»è®ºæ£ç¡®åï¼ââè¿æ¯é误ï¼éçåä¸é¢ä¸æ ·ã
å¦æå®é åå¨åèL > 127ï¼varcharå ç¨ççå®åèæ°Léè¦åé 2个åèæè½è¡¨ç¤ºã
å¦å¤éè¦æ³¨æçæ¯ï¼åé¿å段å表åªåå¨éNULLçåçé¿åº¦ã
表记å½æ¯è¿æ ·ç
对äºç¬¬äºæ¡è®°å½ï¼c4åå¼ä¸ºNULLï¼æ以åªåå¨c1åc2åå³å¯ã
第ä¸æ¡è®°å½çåé¿å段é¿åº¦å表é¨åå ç¨3åè空é´ï¼å 为æc1ãc2ãc4åï¼ä¸å 容é½å¾å°ï¼æ¯åçå®å ç¨åèæ°ç¨1个åèå¯ä»¥è¡¨ç¤ºï¼å èµ·æ¥å°±æ¯3个åèï¼ç¬¬äºæ¡è®°å½åé¿å段é¿åº¦å表é¨åå ç¨2åèã
å½ç¶ï¼å¹¶ä¸æ¯ææè®°å½é½æè¿ä¸ªåé¿å段é¿åº¦å表é¨åï¼æ¯æ¹è¯´è¡¨ä¸ææçåé½ä¸æ¯åé¿çæ°æ®ç±»åæè ææåçå¼é½æ¯NULL çè¯ï¼è¿ä¸é¨åå°±ä¸éè¦æãå®é ä¸å¡å¼åä¸ï¼å ä¹æ²¡æä¸ä½¿ç¨varcharçï¼æ以å®é å¼åä¸çè®°å½é½ä¼æåé¿å段é¿åº¦å表é¨å
3.4 è®°å½ä¸ºNULLï¼innodbå¦ä½å¤çï¼ââNULLå¼å表
è½ä»ç»çå°è¿éï¼ä½ è¯å®æ¯ä¸ªé«æäºãå¦æä½ åæä¸æ ·å¼åè§èä¸ä¸æ¨èNULLï¼ä¸è¬é½åNOT NULLï¼å ¶å®è®°å½ä¸å°±ä¸åå¨NULLå¼å表äºï¼ä¹èçäºç©ºé´ã
å¦æ表ä¸çæäºåå¯è½åå¨NULLå¼ï¼æè¿äºNULLå¼é½æ¾å°è®°å½ççå®æ°æ®ä¸åå¨ä¼å¾å å°æ¹ï¼æ以dynamicè¡æ ¼å¼æè¿äºå¼ä¸ºNULLçåç»ä¸ç®¡çèµ·æ¥ï¼åå¨å°NULLå¼å表ä¸ï¼å®çå¤çè¿ç¨æ¯è¿æ ·çï¼
ç»è®¡è¡¨ä¸å 许åå¨NULLçåæåªäºã主é®åã被NOT NULL修饰çåé½æ¯ä¸å¯ä»¥åå¨NULLå¼çï¼æ以å¨ç»è®¡çæ¶åä¸ä¼æè¿äºåç®è¿å»ãæ¯æ¹è¯´è¡¨testç3个åc1ãc3ãc4é½æ¯å 许åå¨NULLå¼çï¼èc2åæ¯è¢«NOT NULL修饰ï¼ä¸å 许åå¨NULLå¼ã
å¦æ表ä¸æ²¡æå 许åå¨ NULL çåï¼å NULLå¼å表ä¹ä¸åå¨äºï¼å¦åå°æ¯ä¸ªå 许åå¨NULLçå对åºä¸ä¸ªäºè¿å¶ä½ï¼äºè¿å¶ä½æç §åç顺åºéåºæåãäºè¿å¶ä½çå¼ä¸º1æ¶ï¼ä»£è¡¨è¯¥åçå¼ä¸ºNULLï¼ä¸º0æ¶ï¼ä»£è¡¨è¯¥åçå¼ä¸ä¸ºNULLãå 为表testçc1ãc3ãc4é½æ¯å 许åå¨NULLå¼çå 许为NULLçåï¼æ以è¿3个ååäºè¿å¶ä½ç对åºå ³ç³»å°±æ¯è¿æ ·ï¼
NULLå¼åè¡¨å¿ é¡»ç¨æ´æ°ä¸ªåèçä½è¡¨ç¤ºï¼å¦æ使ç¨çäºè¿å¶ä½ä¸ªæ°ä¸æ¯æ´æ°ä¸ªåèï¼åå¨åèçé«ä½è¡¥0ã
ä¹å°±æ¯è¯´ï¼è¡¨teståªæ3个å段å 许为NULLï¼å¯¹åº3个äºè¿å¶ä½ï¼ä¸è¶³1åèï¼é£ä¹å°±å¨é«ä½è¡¥0å³å¯ã
以æ¤ç±»æ¨ï¼å¦æ表ä¸æ9个å段é½å 许为NULLï¼é£ä¹è¿ä¸ªè®°å½çNULLå¼å表就éè¦2个åèæ¥è¡¨ç¤ºï¼é«åèé«ä½è¡¥0ã
对äºç¬¬ä¸æ¡è®°å½ï¼c1ãc3ãc4é½ä¸ä¸ºNULLï¼å¯¹åºç为è¿å¶ä½ä¸º0ï¼åå è¿å¶è¡¨ç¤ºå°±æ¯0x00
对äºç¬¬äºæ¡è®°å½ï¼c3ãc4é½æ¯NULLï¼å¯¹åºçäºè¿å¶ä½ä¸º1ï¼åå è¿å¶è¡¨ç¤ºå°±æ¯0x06
è¿ä¸¤æ¡è®°å½å¨å¡«å äºNULLå¼å表å示æå¾å¦ä¸ï¼
3.5 为ä»ä¹varchar(16383)åä¸å°ç论å符16383ï¼å½±åæ¯è¡å®é å¯ç¨ç©ºé´çå ç´ æåªäºï¼
å¨utf8mb4å符éä¸ï¼VARCHAR(16383)代表çæ¯æå¤å¯ä»¥åå¨16383个å符ãç±äºutf8mb4ç¼ç ä¸ï¼ä¸ä¸ªå符æå¤å ç¨4个åèï¼æ以ç论ä¸VARCHAR(16383)æå¤å¯ä»¥å ç¨ 16383 * 4 = 65532åèãä½æ¯è¿éè¦èèå°InnoDBçå æ°æ®åå é¨ç¢çç空é´ï¼ç±äºè¿äºé¢å¤çå¼éï¼æ æ³å¨ä¸ä¸ªVARCHAR(16383)å段ä¸åå¨16383个å符ã
å é¨ç¢çï¼å é¨ç¢ç主è¦æ¯ç±äºæ°æ®åºé¡µï¼Pageï¼æåï¼Blockï¼çåºå®å¤§å°å¯¼è´çãInnoDBç页大å°é常设置为16KBï¼æ¯ä¸é¡µä¸å å«äºå¤è¡æ°æ®ä»¥åé¢å¤ç页级å æ°æ®ãå¦æä¸é¡µä¸çæ°æ®æ²¡æå®å ¨å¡«æ»¡è¿ä¸ªç©ºé´ï¼é£ä¹å©ä½ç空é´å°±ä¼æ为å é¨ç¢çï¼ä¸è½è¢«å ¶ä»è¡ä½¿ç¨ã
å é¨ç¢çé常å¨ä»¥ä¸æ åµä¸åºç°ï¼
- åºå®å¤§å°çæ°æ®é¡µ/åï¼æ°æ®åºé常使ç¨åºå®å¤§å°çæ°æ®é¡µï¼ä¾å¦ï¼å¨InnoDBä¸ï¼é¡µç大å°é常为16KBï¼æ¥åå¨æ°æ®ãå¦æä¸é¡µä¸çæ°æ®æ²¡æå®å ¨å¡«æ»¡è¿ä¸ªç©ºé´ï¼å©ä¸ç空é´å°±ä¼æ为å é¨ç¢çã
- æ°æ®æ´æ°ï¼å½ä¸ä¸ªå段çå¼è¢«æ´æ°ä¸ºä¸ä¸ªæ´å°çå¼æ¶ï¼å©ä¸ç空é´å¯è½ä¼æ为å é¨ç¢çãæ°æ®åºå¯è½ä¼ä¿çè¿ä¸ªç©ºé´ï¼ä»¥ä¾¿å¨æªæ¥è¿ä¸ªå段çå¼å次å¢å¤§æ¶ä½¿ç¨ã
- é¢ç空é´ï¼ä¸ºäºæé«æ§è½ï¼æ°æ®åºå¯è½ä¼é¢çä¸äºç©ºé´ï¼ä½¿å¾æ°æ®çæå ¥åæ´æ°æä½ä¸éè¦ç«å³éæ°åé 空é´ãè¿äºé¢çç空é´ä¹ä¼æ为å é¨ç¢çã
举个ä¾åï¼
æ们å建ä¸ä¸ªå å«VARCHARå段ç表ï¼
CREATE TABLE test (
id INT AUTO_INCREMENT PRIMARY KEY,
data VARCHAR(100)
);
ç¶åæ们æå ¥ä¸è¡æ°æ®ï¼å ¶ä¸dataå段填å äº100个å符ï¼
INSERT INTO test (data) VALUES (REPEAT('a', 100));
æ¥ä¸æ¥æ们æ´æ°è¿è¡æ°æ®ï¼å°dataå段çå¼æ¹ä¸ºåªæ10个å符ï¼
UPDATE test SET data = REPEAT('a', 10) WHERE id = 1;
å¨è¿ä¸ªä¾åä¸ï¼å½æ们æ´æ°dataå段çå¼æ¶ï¼åæ¥å ç¨ç100个å符ç空é´å¹¶ä¸ä¼ç«å³è¢«æ¶ç¼©ï¼å³ä½¿æ°çå¼åªæ10个å符ãè¿å°±äº§çäºå é¨ç¢çï¼å³é£äºä¸å使ç¨ä½è¿æªè¢«åæ¶ç空é´ã
è¿ç§å é¨ç¢çåçå½±åå¨å®é æä½ä¸å¯è½å¹¶ä¸é£ä¹ææ¾ï¼å 为æ°æ®åºç³»ç»ä¼å°½å¯è½å°éç¨è¿äºç©ºé´ãå¦æåç»ææ°çæ°æ®éè¦æ´å¤ç空é´ï¼è¿äºå é¨ç¢çç空é´å°±å¯è½ä¼è¢«å©ç¨èµ·æ¥ãä½æ¯å¦æåç»æ°æ®ä¸»è¦è¿è¡è¯»æä½èå¾å°è¿è¡åæä½çæ åµä¸ï¼å é¨ç¢çå¯è½ä¼æ为影åæ°æ®åºæ§è½çä¸ä¸ªå ç´ ã
å设æ们æä¸ä¸ªå å«å¤§éæ°æ®ç表ï¼è¿ä¸ªè¡¨ç®å主è¦è¿è¡è¯»æä½ï¼èåæä½åç¸å¯¹è¾å°ãå¦æè¿ä¸ªè¡¨åå¨å¤§éçå é¨ç¢çåï¼å¯è½æ¯ç±è¿å»çåæä½çä¸çï¼ä¾å¦æ´æ°åå é¤ï¼ï¼é£ä¹å®é åå¨çæ°æ®å¯è½åªå ç¨äºå¯ç¨ç©ºé´çä¸å°é¨åï¼å¤§éç空é´è¢«å é¨ç¢çå ç¨ãè¿ç§æ åµä¸ï¼æ°æ®åºéè¦å è½½æ´å¤ç页å°å åä¸æ¥è·åç¸åéçæ°æ®ï¼è¿ä¼å¢å I/Oæä½ï¼ä»èéä½è¯»æä½çæ§è½ã
é¤äºå é¨ç¢çä¹å¤ï¼å½±åæ¯è¡å®é å¯ç¨ç©ºé´çå ¶ä»å ç´ å¯è½å æ¬ä»¥ä¸å 个ï¼
- å æ°æ®ï¼åæå·²ç»ä»ç»ï¼æ¯è¡çå æ°æ®ï¼å æ¬è®°å½å¤´ä¿¡æ¯ãNULLå¼å表ååé¿å段é¿åº¦å表ï¼é½ä¼å ç¨ä¸é¨å空é´ã
- è¡æ ¼å¼ï¼InnoDBçè¡æ ¼å¼ï¼COMPACTï¼DYNAMICæREDUNDANTï¼ä¼å½±åæ¯è¡çå®é å¯ç¨ç©ºé´ãä¾å¦ï¼COMPACTæ ¼å¼ä¼æ´ç´§åï¼å æ¤å¯è½ä¼æä¾æ´å¤çå¯ç¨ç©ºé´ã
- 溢åºé¡µï¼å¯¹äºé常大çå段ï¼å¦BLOBåTEXTç±»åï¼ï¼InnoDBå¯è½ä¼å°æ°æ®åå¨å¨åç¬ç溢åºé¡µä¸ï¼èä¸æ¯ç´æ¥å¨æ°æ®è¡ä¸ãè¿å¯ä»¥ä½¿å¾æ°æ®è¡ä¿æè¾å°ç大å°ï¼ä½ä¹ä¼å¢å åå¨åæ£ç´¢è¿äºå段çå¤ææ§ã
以ä¸æ¯ä¸äºä¸»è¦çå æ°æ®ï¼
è®°å½å¤´ä¿¡æ¯ï¼æ¯ä¸è¡è®°å½å¨InnoDBä¸é½æä¸ä¸ªè®°å½å¤´ï¼å å«äºä¸äºå æ°æ®ï¼å¦è®°å½ç±»åãä¸ä¸ä¸ªè®°å½çä½ç½®çãè®°å½å¤´ç大å°é常为5-7åèã
NULLå¼å表ï¼å¦æ表ä¸çå段å 许NULLå¼ï¼InnoDBä¼ä¸ºæ¯ä¸è¡è®°å½ç»´æ¤ä¸ä¸ªNULLå¼å表ï¼ç¨äºæ è®°åªäºå段çå¼ä¸ºNULLãæ¯ä¸ä¸ªå¯ä»¥ä¸ºNULLçå段ä¼å¨è¿ä¸ªå表ä¸å ç¨1ä½ï¼ä¸æ¯1åèï¼ãæ以ï¼å¦ææn个å段å¯ä»¥ä¸ºNULLï¼é£ä¹NULLå¼å表就éè¦nä½ï¼å³ân/8âåèï¼åä¸åæ´ï¼ã
åé¿å段é¿åº¦å表ï¼å¯¹äºåé¿å段ï¼å¦VARCHARãVARBINARYãTEXTåBLOBç±»åï¼ï¼InnoDBéè¦åå¨æ¯ä¸ªå段å®é å¼çé¿åº¦ãå¦æå段çæ大å¯è½é¿åº¦ä¸è¶ è¿255åèï¼é£ä¹è¿ä¸ªé¿åº¦å¼ä¼å ç¨1个åèï¼å¦æå段çæ大å¯è½é¿åº¦è¶ è¿255åèï¼é£ä¹é¿åº¦å¼å¯è½ä¼å ç¨1个åèï¼å¦æå®é é¿åº¦ä¸è¶ è¿127åèï¼æ2个åèï¼å¦æå®é é¿åº¦è¶ è¿127åèï¼ã
é常æ¥è¯´ï¼å é¨ç¢çåå æ°æ®å¯è½ä¼å¯¹æ¯è¡çå®é å¯ç¨ç©ºé´äº§çæ大çå½±åã
注æï¼CHARç±»ååVARCHARç±»åå¨å æ°æ®åå é¨ç¢çæ¹é¢æäºä¸åï¼
- å æ°æ®ï¼ç±äºCHARç±»åæ¯åºå®é¿åº¦çï¼æ以å®ä¸éè¦åVARCHARç±»åé£æ ·åå¨é¢å¤çå æ°æ®æ¥è¡¨ç¤ºå®é çé¿åº¦ãè¿æå³ç对äºåæ ·é¿åº¦çå符串ï¼CHARç±»åä¼ä½¿ç¨æ´å°ç空é´æ¥åå¨å æ°æ®ã
- å é¨ç¢çï¼CHARç±»åç±äºæ¯åºå®é¿åº¦çï¼å¯è½ä¼äº§çå é¨ç¢çãæ¯å¦ï¼å¦æå®ä¹äºä¸ä¸ªCHAR(100)å段ï¼ä½å®é ä¸åªåå¨äº10个å符çå符串ï¼é£ä¹å©ä¸ç90个å符ç空é´å°±ä¼è¢«æµªè´¹ï¼è¿å°±æ¯å é¨ç¢çãå¦ä¸æ¹é¢ï¼VARCHARç±»ååªä¼ä½¿ç¨å®é æéç空é´ï¼å æ¤å é¨ç¢çä¼è¾å°ã
æ以ï¼å°½ç®¡CHARç±»åä¸éè¦åå¨é¿åº¦çå æ°æ®ï¼ä½å®å¯è½ä¼å 为åºå®é¿åº¦çç¹æ§è产çæ´å¤çå é¨ç¢çã
å¨MySQLä¸ï¼ä»»ä½ç±»åçåé½å¯ä»¥è¢«å£°æ为NULLæNOT NULLï¼æ以CHARç±»åä¹å¯ä»¥æNULLå¼å表ã
3.6 æ个åæ°æ®å ç¨çåèæ°é常å¤æä¹åï¼ââdynamicè¡æ ¼å¼ç溢åºå
å¨MySQL 5.7åä¹åççæ¬ä¸ï¼é»è®¤çè¡æ ¼å¼æ¯DYNAMICãå¨DYNAMICè¡æ ¼å¼ä¸ï¼å¦æä¸ä¸ªå段ç大å°è¶ è¿äºé¡µé¢çå¯ç¨ç©ºé´ï¼è¯¥å段就ä¼è¢«åå¨ä¸ºæº¢åºåã
è¿éæ¯ä¸ä¸ªä¾åï¼
CREATE TABLE `big_data` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`data` longblob,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
å¨è¿ä¸ªè¡¨ä¸ï¼dataåçç±»åæ¯longblobï¼è¿æå³çå®å¯ä»¥åå¨çæ°æ®é¿åº¦æ大达å°4GBãå¦æä½ æå ¥ä¸ä¸ªå¤§äº16KBçæ°æ®å°è¿ä¸ªè¡¨ï¼é£ä¹dataåçæ°æ®å°±ä¼è¢«ä½ä¸ºæº¢åºåå¤çã
INSERT INTO big_data (data) VALUES (REPEAT('a', 17000));
å¨è¿ä¸ªä¾åä¸ï¼æå ¥çæ°æ®é¿åº¦è¶ è¿äº16KBï¼æ以dataåçæ°æ®ä¼è¢«ä½ä¸ºæº¢åºåå¤çãå¨åå§ç表ä¸ï¼dataååªä¼åå¨ä¸ä¸ª20åèçæéï¼è¿ä¸ªæéæåå®é æ°æ®çåå¨ä½ç½®ã
è¿æ ·ç设计å¯ä»¥ç¡®ä¿æ¯ä¸ªé¡µå çæ°æ®é½ä¿æå¨åçç大å°èå´å ï¼é¿å äºç±äºå个å段æ°æ®è¿å¤§å¯¼è´ç页åè£çé®é¢ï¼ä»èæé«äºæ´ä½çåå¨æçåæ¥è¯¢æ§è½ãåæ¶ï¼å¯¹äºè¯»å溢åºåçæ°æ®ï¼è½ç¶å¯è½éè¦é¢å¤çç£çI/Oï¼ä½åªè¦æ°æ®ç访é®æ¯é¡ºåºçï¼é常è¿ä¸ªå¼é并ä¸ä¼å¤ªå¤§ã
åç»ï¼å¦æ大家对innodbåå¨ç»æå ¶ä»è¡æ ¼å¼æå ´è¶£ï¼æè æ没说çè®°å½å¤´ä¿¡æ¯ï¼å¯ä»¥å»é 读ãMySQLæ¯ææ ·è¿è¡çãä¸ä¹¦ï¼æå书ä¸ä¸åçæ¯ï¼ä¹¦ä¸è®²çCompactæ ¼å¼ï¼å符éæ¯asciiï¼æéç¨çæ¯å¹³æ¶å¼åä¸ç¨å°çé»è®¤dynamicæ ¼å¼ï¼å符éæ¯utf8mb4ï¼å¯¹äºä¹¦ä¸æ¯è¾é¾ç解çç¹é½ä¸¾åºäºä¾åï¼å符éåååææçæ°æ®æå¨æä¸åå¾ä¸é½æéæ°è®¡ç®ã大家平æ¶æè®¸æ²¡å ³æ³¨è¿è¡æ ¼å¼ï¼é£ä¹å°±æ¯æç §dynamicæ ¼å¼ç解就å¯ä»¥ï¼æ´è´´è¿å®é å¼åã
å ³æ³¨#å为äºå¼åè èç# ç¹å»ä¸æ¹ï¼ç¬¬ä¸æ¶é´äºè§£å为äºæ°é²ææ¯~
å为äºå客_大æ°æ®å客_AIå客_äºè®¡ç®å客_å¼åè ä¸å¿-å为äº