å¨ä¸ä¸ç¯ãMySQLä½ç³»æ¶æãä¸è®²å°MySQLçæ´ä½ä½ç³»æ¶æï¼ä½æ¯åå°ç¯å¹ éå¶ï¼ä¸è½å¤æ·±å ¥ç»è讲解ï¼å æ¤é对ç½åé®é¢æ¯è¾éä¸çç¹åä¸ä¸ªè¯¦ç»ç讲解ã
InnoDBé»è®¤çè¡æ ¼å¼æ¯Dynamicï¼æ¬æå以Compact为ä¾ä»ç»ï¼ä¸¤è æ¬èº«ä¹æ¯åå ¶ç¸ä¼¼çãæ们å æ¥å顾ä¸ä¸Compactè¡ç»æï¼å¦ä¸ï¼
Compactæ ¼å¼è¡
åé¿å段é¿åº¦å表
âåé¿â顾åæä¹è¿éåªåå¨ä¸åºå®é¿åº¦çå段é¿åº¦å¼ï¼MySQLåé¿çå段类åæï¼VARCHARãVARBINARYãTEXTãBLOBçç±»åã
æ¥ä¸æ¥ä¸ºäºæ¹ä¾¿é 读æ们å°åé¿å段é¿åº¦å表ç®ç§°ä¸ºåé¿å表ã
ç®ç
Compactè¡ä¸è®°å½å¤´ä¿¡æ¯ãRowIDãäºå¡IDãåæ»æéé½æ¯æåºå®åèæ°çï¼ä½æ¯åæ°æ®å ç¨çå®é é¿åº¦æ¯æ æ³è®¡ç®çï¼å 为æ°æ®åä¸å¯è½åå¨åé¿çå段类åï¼é£ä¹æ们就æ æ³è®¡ç®æ´ä¸ªè¡ç精确é¿åº¦äºï¼é£ä¹å°±ä¸ç¥éè¡ä¸è¡ä¹é´çè¾¹çäºãå æ¤æ们éè¦éè¿åé¿å表æ¥è®°å½åé¿çå段æå ç¨çåèæ°ã
è§å
- åé¿å表çè®°å½æ¯æç §åé¿åéåºåæ¾çï¼å¨ä¸ä¸ç¯æç« ä¸æ示ä¾ã
- å¦æåé¿å段çå¼ä¸ºNULLï¼åä¼è®°å½å¨NULLå¼å表ï¼åé¿å表ä¸è®°å½ã
- åé¿å段çå®ä¹é¿åº¦<=255åè使ç¨1åèåå¨é¿åº¦ï¼å¦åç¨2åèã
ä¾å¦ï¼å建åç±»å为varchar(m)ï¼å符é为utf8ï¼åä¸ä¸ªå符å ç¨3åèï¼åå®ä¹é¿åº¦ä¸ºm*3<=255ï¼å ¶å®å符éä¸å¨èµè¿°ï¼MySQL5.0ä¹åå°varchar(m)çmç±åèæ°è°æ´ä¸ºå符æ°ï¼ã
温馨æ示ï¼
ä»è¿ä¸ªè§åå¯ä»¥çåºï¼å¨è®¾è®¡åæ¶ï¼éå¿ è¦å¯ä»¥åå°åé¿å段ç使ç¨ï¼è¿æ ·å¯ä»¥ææåå°åé¿å表é¿åº¦ã
å¦æ使ç¨å°åé¿ç±»åå¦varchar(m)ï¼å ¶ä¸mçå¼å°½é设置为é¢è®¡åå¨å符æ°çæ大é¿åº¦ï¼ä¸è¦å®ä¹å¤ªè¿éæï¼å¯è½ä¼å½±åè¡çç¸å ³è®¡ç®æ§è½ï¼å 为å°äºçäº255åèï¼è¯´æå ¶é¿åº¦ä¸ä¼è¶ è¿1111 1111ï¼ä¸åè表示çæ大æ 符å·æ´æ°ï¼ï¼åç´æ¥ä½¿ç¨1åèï¼å½å¤§äº255æ¶ä¼å¤ä¸æ¡è§å计ç®ï¼å³è§å4ã
4. åé¿å段çå®é¿åº¦<=127åè使ç¨1åèåå¨é¿åº¦ï¼å¦å为两åèã
为ä»ä¹æ¯127å¢ï¼
InnoDB设计è é常çç¿æºï¼ä»å°ç¬¬ä¸ä¸ªåèçæé«ä½ä¸ä½ç¨æ¥æ è®°æ¯å¦æ¯è¿ç»ç两åè表示åé¿å段é¿åº¦ï¼å³é«ä½ä¸º0表示å段é¿åº¦å ç¨1åèï¼è¥ä¸º1ï¼åéè¦ååå读åä¸ä¸ªåèãä½æ¯æ个ç¹æ®æ åµï¼è§å3ä¸æå°ç255åèï¼255äºè¿å¶ä¸º1111 1111ï¼è¿å°±åè§å4å²çªäºï¼å æ¤éè¦ä¼å å¤æè§å3ã
127çäºè¿å¶ä¸º0111 1111ï¼é£ä¹åå 1ååæ128(1000 0000)ï¼æç §è§åï¼å¿ é¡»å两个åèï¼å³00 80ãæé«ä½æ¢è¦ä½ä¸ºæ è¯ä½ï¼åè¦ä½ä¸ºæ°æ®ä½ï¼é£ä¹127å°±æ¯è¾¹çå¼äºï¼å¦åæ们éè¦å¯¹æé«ä½å翻转æè½å¾å°å®é çé¿åº¦å¼ï¼ä½æ¯ç¿»è½¬åä¼å¯¼è´æ¹åå ¶ä½ä¸ºæ°æ®ä½æ¶çå¼ï¼æ¯å¦é¿åº¦01 ffå01 7fé½è¦è®°å½ä¸º01 ffï¼é£ä¹è¿ä¸¤ä¸ªå¼å°±åä¸æ¸ äºï¼ã
ä¸é¢æ们çé讲ä¸ä¸åé¿å表ç读åæ¹æ³ã
å¦ä½è¯»ååé¿å表ï¼
åé¿å表çåå¨é¿åº¦å¼æ¯è¿ç»çï¼æ们å¦ä½åºååºæ¯ä¸ªé¿åº¦å¼å¢ï¼
æ们å ååºä¸ä¸ªç»è®ºï¼å¸¦çè¿ä¸ªç»è®ºçä¸é¢ç示ä¾ï¼
ç»è®ºï¼åé¿å表为éåºåæ¾éåºè¯»åï¼éåºè¯»åç第ä¸ä¸ªåèï¼é¦å éè¦å¤æå段å®ä¹é¿åº¦æ¯å¦è¶ è¿255åèï¼è¥æ²¡æè¶ è¿å读åç第ä¸åèå³ä¸ºé¿åº¦å¼ï¼å¦åï¼å¦æ为1å表示è¿è¦åå读åä¸ä¸ªåèï¼ä¸¤ä¸ªåèå¼å为åé¿åé¿åº¦ï¼è¥é«ä½ä¸º0å该åèå¼å³ä¸ºåé¿å段çé¿åº¦ã
è¿æ¯æ建ç«çä¸å¼ 表ï¼row_format=COMPACT engine=innodb charset=asciiï¼ï¼æ5个åï¼æå ¥çæ°æ®å¦ä¸å¾ï¼
表ç»æ
表æ°æ®
ç¶åéè¿å½ä»¤è¡çä¸äºåæä½ï¼å ·ä½æä¹æä½çï¼æåç»åºä¸ªæç¨ï¼ä»å¤©èä¸å¨äºï¼ï¼å¾å°äºå ¶ibdæ件çæ°æ®å¦ä¸ï¼
ibdæ件ï¼16è¿å¶ï¼
ç¶åæ们å¯è§åä¸ä¸ï¼å¾å°å¦ä¸æ ¼å¼ï¼ä¸ºäºåå°æå表述ï¼æç´æ¥å¨å¾ä¸åäºæåæ 注ï¼ï¼
Compactæ ¼å¼æ°æ®è¡å®é åå¨
æ们éç¹çä¸ä¸åé¿å表ï¼02 03代表ä»ä¹å¢ï¼æ们çä¸ä¸åé¿å段æcol1ãcol3ãcol4ï¼æ ¹æ®è§å2æ们æcol3è¿æ»¤æï¼å©ä¸col1ãcol4ï¼å¼åå«ä¸ºaaaãccï¼æç §è§å1å¯å¾åº02 03ãåå¦æ们å¨è¡¨æåé¢æå ¥ä¸ä¸ªæ°åcol0ï¼varchar(512)ï¼å ¶å¼çäº128åèï¼ååé¿å表å为ï¼02 03 00 80ã
æ们æ¾å°ä¸ä¸ªæ°æ®è¡è¦ä¹æ¯éè¿æ§½ï¼è¦ä¹æ¯éè¿ä¸ä¸æ¡è¡è®°å½å¤´ä¸çnext_recordæéï¼è¿ä¸¤è é½æ¯æåçè¡è®°å½ç¬¬ä¸ä¸ªåçä½ç½®ãå¦æç¥éäºç¬¬ä¸ä¸ªåçä½ç½®ï¼æ们就å¯ä»¥å左侧æç´¢ï¼æ¾å°çå°±æ¯è®°å½å¤´ï¼åºå®å¤§å°ï¼åNULLæ è®°ä½ï¼å¯è®¡ç®åºå ç¨å¤§å°ï¼ä¸é¢ä¼è®²å°ï¼ï¼åå»ä¸ä»ä»¬å ç¨çåèæ°å°±å¯ä»¥è®¡ç®åºåé¿å表çæå³ä¾§èµ·å§ä½ç½®äºãä¸é¢æå°åé¿å表为ï¼02 03 00 80ï¼æ们é¦å 读å°80ï¼é¦å éè¿è¡¨çå®ä¹ä¿¡æ¯è·å第ä¸ä¸ªåé¿åçå®ä¹é¿åº¦ä¸º512ï¼åç´æ¥å¤æé«ä½ï¼åç°å ¶é«ä½ä¸º1ï¼å读ä¸ä¸ä¸ªåèï¼æç»å ¶å®é é¿åº¦00 80ã
è¡è¯»åè§å
æ没æåç°ï¼ç»åä¸å¾çï¼ï¼å ¶æ£ç´¢æ¹å¼å°±æ¯åæéï¼ä¸ä¸ªå左读åé¿å表ï¼ä¸ä¸ªåå³è¯»å个åï¼è¿éå·¦æé读ååé¿å表ä¸çåé¿åº¦å¼é¡ºåºæ¯åå³æé读ååå¼ç顺åºæ¯ä¸æ ·çï¼è¿å°±æ¯ä¸ºä»ä¹åé¿å表è¦éåºåå¨çåå ã综ä¸æè¿°ï¼è¿ä¹æ¯ä¸ºä»ä¹åé¿å表è¦éåºè¯»åçåå ã
ä¸é¢è®²å¾æé£ä¹ç¹å°å¦äºï¼ä½æ¯ä¸ºäºè®²æ¸ æ¥ï¼ä½ 们å¿ä¸ä¸ï¼å¡å¿ 认ç读ä¸éã
NULLæ è®°ä½
åé¢è®²äºåé¿å表ï¼å ¶ä¸æ¯æ²¡æè®°å½NULLçåé¿åçï¼é£ä¹NULLå°±ä¼åä¸ä¸ªé常éè¦çè¡¥å è®°å½ï¼è®°å½ææå 许为NULLä¸åå¼å®é 为NULLçåã
ç®ç
为äºè®©æ们è½å¤æ£ç¡®ç读ååå¼ï¼æ们éè¿n个åèæ¥è®°å½ææNULLå¼çåã
è§å
- åªæå段å¼å 许为NULLçå段æä¼è®°å½å¨NULLå¼æ è®°ä½ä¸ã
- NULLå¼æ è®°ä½æ¯æ0~nåèç»æçï¼æ¯ä¸ªåèä¸çä½å°±ä»£è¡¨äºåæ¯å¦ä¸ºNULLå¼ï¼å³0代表ä¸ä¸ºNULLï¼1代表为NULLã
- å½ææåé½ä¸å 许为空æ¶ï¼å没æ该æ è®°ä½ã
温馨æ示ï¼å»ºè¡¨çæ¶åå°½éåå°å 许NULLå段çåºç°ï¼æ好æ¯é½ä¸å 许为NULLï¼è¿æ ·æ¯ä¸ªè®°å½è¡ä¼è约æå°1个åèçåå¨ç©ºé´ã
4. NULLå¼æ è®°ä½ä¸ä½æ¯æç §åçéåºåå¨çï¼è¯»åæ¹åä¸åé¿å表ä¸æ ·ï¼è§ä¸å¾ï¼
NULLå¼æ è®°ä½è¯»åè§å
5. NULLæ è®°ä½ç计ç®é»è¾ä¸ºï¼åä¸åæ´(å 许为NULLçåæ°é/8)=NULLæ è®°åèæ°ã
åºå®å¤´ä¿¡æ¯
头记å½ä¿¡æ¯ä¸å å«äºè¯¥è¡å¨é¡µä¸çä½ç½®ãè¡ç¸å¯¹äºä¸ä¸æ¡è¡è®°å½çä½ç½®çä¸ç³»åä½ç½®åç¶æä¿¡æ¯ã
å称 | å ç¨ä½æ°(bit) | åè½æè¿° |
é¢çä½ | 1 | é¢çä½ |
é¢çä½ | 1 | é¢çä½ |
delete_flag | 1 | å é¤æ è¯ |
min_rec_flag | 1 | éå¶åèç¹æå°ç®å½é¡¹è®°å½æ è¯ |
n_owned | 4 | è¥ä¸ºåç»ç头å·è®°å½ï¼åè®°å½ç»å çè®°å½æ°ï¼æ¯ç»4-8ä¸ªè®°å½ |
heap_no | 13 | å½åè®°å½å¨é¡µä¸çç¸å¯¹ä½ç½® |
record_type | 3 | è®°å½ç±»åï¼0ï¼è¡¨ç¤ºæ®éè®°å½ï¼1ï¼è¡¨ç¤ºB+æ éå¶åèç¹çç®å½é¡¹è®°å½ï¼2ï¼è¡¨ç¤ºInfimumè®°å½ï¼3ï¼è¡¨ç¤ºSupremumè®°å½ï¼ |
next_record | 16 | ä¸ä¸æ¡è®°å½çç¸å¯¹ä½ç½® |
éèå
éèåä¾å¦ï¼row_idï¼è¡çPrimary Keyï¼è¥æ²¡æå®åæä¼çæ该åï¼ãtrx_idï¼äºå¡IDï¼ãroll_pointerï¼åæ»æéï¼ï¼è¿äºé½æ¯MySQLäºå¡åMVCCå®ç°å¿ ä¸å¯å°çæ°æ®ï¼ç±MySQLå é¨ç»´æ¤ï¼åç»å¨ä»ç»äºå¡åè¿çæ¬æ§å¶åè®®MVCCä¼è¯¦ç»è®²å°ã
å称 | å ç¨åèæ° | åè½æè¿° |
row_id | 6 | è¡å· |
trx_id | 6 | äºå¡ID |
roll_pointer | 7 | åæ»æé |
Dynamicæ ¼å¼ä¸Compactæ ¼å¼
è¿éç®åä»ç»ä¸ä¸Dynamicæ ¼å¼ä¸Compactæ ¼å¼å¼åï¼
- Dynamicæ ¼å¼æ¯æ对大åå¨æå段ç页å¤åå¨è½åï¼èèéç´¢å¼èç¹åªéè¦è®°å½å ¶æº¢åºé¡µé¢çæéï¼é¿åº¦20åèï¼è¿ä¹æ¯ä¸é¢æ²¡ææå°çCompactæ ¼å¼å¯è½åå¨è·¨é¡µåå¨çé®é¢ï¼è§£å³æ¹æ¡ä¸¤ç§æ ¼å¼é½æ¯ç±»ä¼¼çï¼ã
- å å ¶ä¸è¿°ç¹æ§ï¼å ¶å¯¹å¤§åç´¢å¼é®åç¼çæ¯æè½åå°±æ¾èæè§äºï¼ç´¢å¼å¼é¡µå¤åå¨ï¼æ大æ¯æ3072åèï¼è¿ä¸ªé¿åº¦åinnodb_large_prefixé ç½®æ§å¶ï¼ã
- Dynamicæ ¼å¼å¯¹å°åå段çæ¯æä»ç¶ä¸Compactå®å ¨ä¸è´ã
InfimunåSupremumè¡
åè¿ç¯æç« å¨è¿é顺便ä»ç»ä¸ä¸ï¼è¿ä¸¤ä¸ªè®°å½å°±æ¯ç¡®å®ä¸ä¸ªé¡µå è¡è®°å½çåå¨è¾¹ççï¼å¨å¾ï¼ibdæ件ï¼16è¿å¶ï¼ä¸ä¹å¯ä»¥ç´è§çå°ï¼ä»ä»¬å¨æææ°æ®è¡çæåé¢ï¼ä»ä»¬çnext_recoerdæéåå«æåå å 第ä¸ä¸ªè¡è®°å½ä¸æåä¸ä¸ªè¡è®°å½ã
æ»ç»
- å建表çæ¶åï¼å°½éåå°å¨æåç使ç¨ï¼å°¤å ¶æ¯TEXTç±»åï¼ï¼å¯ä»¥ä½¿ç¨charæè å ¶å®ç±»å代æ¿ï¼æ¢å¯ä»¥è约åå¨ç©ºé´ï¼åå¯ä»¥æåè¡æ£ç´¢è®¡ç®æ§è½ã
- å¦æ大é使ç¨å°åé¿å段类åï¼ä¹éè¦åçå°è®¡ç®å ¶å符æ°ï¼ä¸è¦å®ä¹å¤ªè¿éæï¼ä»¥å å½±å计ç®æ§è½ã
- å°½éä¸è¦å»ºå 许为NULLçåï¼è¿æ ·æ¢å¯ä»¥åå°è¡åå¨ç©ºé´ï¼åå¯ä»¥æå计ç®æ§è½ã
以ä¸å°±æ¯å¯¹Compactè¡ç详ç»ä»ç»äºï¼å¦ææçé®æè ä¸å¯¹çå°æ¹æ¬¢è¿å¨è¯è®ºåºæåºï¼å¦æä½ çå°è¿ç¯æç« ææ¶è·å°±è¯·ç»ä½è ä¸ä¸ªå ³æ³¨+ç¹èµå§[éå¿]ï¼