# MySQL
åä½è
github: https://github.com/CyC2018/Interview-Notebook
PDFå¶ä½github: https://github.com/sjsdfg/Interview-Notebook-PDF
# ä¸ãåå¨å¼æ
## InnoDB
InnoDB æ¯ MySQL é»è®¤çäºå¡ååå¨å¼æï¼åªæå¨éè¦ InnoDB 䏿¯æçç¹æ§æ¶ï¼æèè使ç¨å
¶å®åå¨å¼æã
å®ç°äºå个æ åçé离级å«ï¼é»è®¤çº§å«æ¯å¯éå¤è¯»ï¼REPEATABLE READï¼ãå¨å¯éå¤è¯»é离级å«ä¸ï¼éè¿å¤çæ¬å¹¶åæ§å¶ï¼MVCCï¼+ é´ééï¼next-key lockingï¼é²æ¢å¹»å½±è¯»ã
ä¸»ç´¢å¼æ¯èç°ç´¢å¼ï¼å¨ç´¢å¼ä¸ä¿åäºæ°æ®ï¼ä»èé¿å
ç´æ¥è¯»åç£çï¼å æ¤å¯¹æ¥è¯¢æ§è½æå¾å¤§çæåã
å
é¨åäºå¾å¤ä¼åï¼å
æ¬ä»ç£çè¯»åæ°æ®æ¶éç¨çå¯é¢æµæ§è¯»ãè½å¤å 快读æä½å¹¶ä¸èªå¨å建çèªéåºåå¸ç´¢å¼ãè½å¤å éæå
¥æä½çæå
¥ç¼å²åºçã
æ¯æçæ£çå¨çº¿çå¤ä»½ãå
¶å®åå¨å¼æä¸æ¯æå¨çº¿çå¤ä»½ï¼è¦è·åä¸è´æ§è§å¾éè¦åæ¢å¯¹ææè¡¨çåå
¥ï¼èå¨è¯»åæ··ååºæ¯ä¸ï¼åæ¢åå
¥å¯è½ä¹æå³çåæ¢è¯»åã
## MyISAM
MyISAM 设计ç®åï¼æ°æ®ä»¥ç´§å¯æ ¼å¼åå¨ã对äºåªè¯»æ°æ®ï¼æè
表æ¯è¾å°ãå¯ä»¥å®¹å¿ä¿®å¤æä½ï¼åä¾ç¶å¯ä»¥ä½¿ç¨ MyISAMã
MyISAM æä¾äºå¤§éçç¹æ§ï¼å
æ¬å缩表ãç©ºé´æ°æ®ç´¢å¼çã
䏿¯æäºå¡ã
䏿¯æè¡çº§éï¼åªè½å¯¹æ´å¼ 表å éï¼è¯»åæ¶ä¼å¯¹éè¦è¯»å°çææè¡¨å å
±äº«éï¼åå
¥æ¶åå¯¹è¡¨å æå®éãä½å¨è¡¨æè¯»åæä½çåæ¶ï¼ä¹å¯ä»¥å¾è¡¨ä¸æå
¥æ°çè®°å½ï¼è¿è¢«ç§°ä¸ºå¹¶åæå
¥ï¼CONCURRENT INSERTï¼ã
å¯ä»¥æå·¥æè
èªå¨æ§è¡æ£æ¥åä¿®å¤æä½ï¼ä½æ¯åäºå¡æ¢å¤ä»¥åå´©æºæ¢å¤ä¸åï¼å¯è½å¯¼è´ä¸äºæ°æ®ä¸¢å¤±ï¼èä¸ä¿®å¤æä½æ¯é常æ
¢çã
妿æå®äº DELAY_KEY_WRITE é项ï¼å¨æ¯æ¬¡ä¿®æ¹æ§è¡å®ææ¶ï¼ä¸ä¼ç«å³å°ä¿®æ¹çç´¢å¼æ°æ®åå
¥ç£çï¼èæ¯ä¼åå°å
åä¸çé®ç¼å²åºï¼åªæå¨æ¸
çé®ç¼å²åºæè
å
³éè¡¨çæ¶åæä¼å°å¯¹åºçç´¢å¼ååå
¥ç£çãè¿ç§æ¹å¼å¯ä»¥æå¤§çæååå
¥æ§è½ï¼ä½æ¯å¨æ°æ®åºæè
主æºå´©æºæ¶ä¼é æç´¢å¼æåï¼éè¦æ§è¡ä¿®å¤æä½ã
## æ¯è¾
- äºå¡ï¼InnoDB æ¯äºå¡åçï¼å¯ä»¥ä½¿ç¨ Commit å Rollback è¯å¥ã
- å¹¶åï¼MyISAM åªæ¯æè¡¨çº§éï¼è InnoDB è¿æ¯æè¡çº§éã
- å¤é®ï¼InnoDB æ¯æå¤é®ã
- å¤ä»½ï¼InnoDB æ¯æå¨çº¿çå¤ä»½ã
- å´©æºæ¢å¤ï¼MyISAM å´©æºååçæåçæ¦çæ¯ InnoDB é«å¾å¤ï¼è䏿¢å¤çéåº¦ä¹æ´æ
¢ã
- å
¶å®ç¹æ§ï¼MyISAM æ¯æå缩表åç©ºé´æ°æ®ç´¢å¼ã
# äºãæ°æ®ç±»å
## æ´å
TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT åå«ä½¿ç¨ 8, 16, 24, 32, 64 ä½åå¨ç©ºé´ï¼ä¸è¬æ
åµä¸è¶å°çåè¶å¥½ã
INT(11) ä¸çæ°ååªæ¯è§å®äºäº¤äºå·¥å
·æ¾ç¤ºå符ç个æ°ï¼å¯¹äºåå¨åè®¡ç®æ¥è¯´æ¯æ²¡ææä¹çã
## æµ®ç¹æ°
FLOAT å DOUBLE 为浮ç¹ç±»åï¼DECIMAL 为é«ç²¾åº¦å°æ°ç±»åãCPU åçæ¯ææµ®ç¹è¿ç®ï¼ä½æ¯ä¸æ¯æ DECIMAl ç±»åç计ç®ï¼å æ¤ DECIMAL çè®¡ç®æ¯æµ®ç¹ç±»åéè¦æ´é«ç代价ã
FLOATãDOUBLE å DECIMAL é½å¯ä»¥æå®å宽ï¼ä¾å¦ DECIMAL(18, 9) 表示æ»å
± 18 ä½ï¼å 9 ä½åå¨å°æ°é¨åï¼å©ä¸ 9 ä½å卿´æ°é¨åã
## å符串
ä¸»è¦æ CHAR å VARCHAR 两ç§ç±»åï¼ä¸ç§æ¯å®é¿çï¼ä¸ç§æ¯åé¿çã
VARCHAR è¿ç§åé¿ç±»åè½å¤èç空é´ï¼å 为åªéè¦åå¨å¿
è¦çå
容ã使¯å¨æ§è¡ UPDATE æ¶å¯è½ä¼ä½¿è¡å徿¯åæ¥é¿ï¼å½è¶
åºä¸ä¸ªé¡µæè½å®¹çº³ç大尿¶ï¼å°±è¦æ§è¡é¢å¤çæä½ãMyISAM ä¼å°è¡ææä¸åççæ®µåå¨ï¼è InnoDB åéè¦åè£é¡µæ¥ä½¿è¡æ¾è¿é¡µå
ã
VARCHAR ä¼ä¿çå符串æ«å°¾çç©ºæ ¼ï¼è CHAR ä¼å é¤ã
## æ¶é´åæ¥æ
MySQL æä¾äºä¸¤ç§ç¸ä¼¼çæ¥ææ¶é´ç±»åï¼DATETIME å TIMESTAMPã
### 1. DATETIME
è½å¤ä¿åä» 1001 å¹´å° 9999 å¹´çæ¥æåæ¶é´ï¼ç²¾åº¦ä¸ºç§ï¼ä½¿ç¨ 8 åèçåå¨ç©ºé´ã
å®ä¸æ¶åºæ å
³ã
é»è®¤æ
åµä¸ï¼MySQL 以ä¸ç§å¯æåºçãæ æ§ä¹çæ ¼å¼æ¾ç¤º DATETIME å¼ï¼ä¾å¦â2008-01-16 22:37:08âï¼è¿æ¯ ANSI æ åå®ä¹çæ¥æåæ¶é´è¡¨ç¤ºæ¹æ³ã
### 2. TIMESTAMP
å UNIX æ¶é´æ³ç¸åï¼ä¿åä» 1970 å¹´ 1 æ 1 æ¥åå¤ï¼æ ¼æå¨æ²»æ¶é´ï¼ä»¥æ¥çç§æ°ï¼ä½¿ç¨ 4 个åèï¼åªè½è¡¨ç¤ºä» 1970 å¹´ å° 2038 å¹´ã
å®åæ¶åºæå
³ï¼ä¹å°±æ¯è¯´ä¸ä¸ªæ¶é´æ³å¨ä¸åçæ¶åºæä»£è¡¨çå
·ä½æ¶é´æ¯ä¸åçã
MySQL æä¾äº FROM_UNIXTIME() 彿°æ UNIX æ¶é´æ³è½¬æ¢ä¸ºæ¥æï¼å¹¶æä¾äº UNIX_TIMESTAMP() 彿°ææ¥æè½¬æ¢ä¸º UNIX æ¶é´æ³ã
é»è®¤æ
åµä¸ï¼å¦ææå
¥æ¶æ²¡ææå® TIMESTAMP åçå¼ï¼ä¼å°è¿ä¸ªå¼è®¾ç½®ä¸ºå½åæ¶é´ã
åºè¯¥å°½éä½¿ç¨ TIMESTAMPï¼å ä¸ºå®æ¯ DATETIME ç©ºé´æçæ´é«ã
# ä¸ãç´¢å¼
ç´¢å¼è½å¤è½»æå°æ¥è¯¢æ§è½æåå 个æ°é级ã
对äºé常å°ç表ã大é¨åæ
åµä¸ç®åçå
¨è¡¨æ«ææ¯å»ºç«ç´¢å¼æ´é«æã对äºä¸å°å¤§åç表ï¼ç´¢å¼å°±é常ææã使¯å¯¹äºç¹å¤§åç表ï¼å»ºç«åç»´æ¤ç´¢å¼ç代价å°ä¼éä¹å¢é¿ãè¿ç§æ
åµä¸ï¼éè¦ç¨å°ä¸ç§ææ¯å¯ä»¥ç´æ¥åºååºéè¦æ¥è¯¢çä¸ç»æ°æ®ï¼è䏿¯ä¸æ¡è®°å½ä¸æ¡è®°å½å°å¹é
ï¼ä¾å¦å¯ä»¥ä½¿ç¨ååºææ¯ã
ç´¢å¼æ¯å¨åå¨å¼æå±å®ç°çï¼è䏿¯å¨æå¡å¨å±å®ç°çï¼æä»¥ä¸ååå¨å¼æå
·æä¸åçç´¢å¼ç±»ååå®ç°ã
## B+ Tree åç
### 1. æ°æ®ç»æ
B Tree æçæ¯ Balance Treeï¼ä¹å°±æ¯å¹³è¡¡æ ãå¹³è¡¡æ æ¶ä¸é¢æ¥æ¾æ ï¼å¹¶ä¸ææå¶åèç¹ä½äºåä¸å±ã
B+ Tree æ¯åºäº B Tree åå¶åèç¹é¡ºåºè®¿é®æéè¿è¡å®ç°ï¼å®å
·æ B Tree ç平衡æ§ï¼å¹¶ä¸éè¿é¡ºåºè®¿é®æéæ¥æé«åºé´æ¥è¯¢çæ§è½ã
å¨ B+ Tree ä¸ï¼ä¸ä¸ªèç¹ä¸ç key ä»å·¦å°å³ééåæåï¼å¦ææä¸ªæéçå·¦å³ç¸é» key å嫿¯ keyi å keyi+1ï¼ä¸ä¸ä¸º nullï¼å该æéæåèç¹çææ key 大äºçäº keyi ä¸å°äºçäº keyi+1ã
### 2. æä½
æä½æ¶ï¼é¦å
卿 ¹èç¹è¿è¡äºåæ¥æ¾ï¼æ¾å°ä¸ä¸ª key æå¨çæéï¼ç¶åéå½å°å¨æéææåçèç¹è¿è¡æ¥æ¾ãç´å°æ¥æ¾å°å¶åèç¹ï¼ç¶åå¨å¶åèç¹ä¸è¿è¡äºåæ¥æ¾ï¼æ¾åº key æå¯¹åºç dataã
æå
¥å 餿ä½è®°å½ä¼ç ´å平衡æ ç平衡æ§ï¼å æ¤å¨æå
¥å 餿¶ï¼éè¦å¯¹æ è¿è¡ä¸ä¸ªåè£ãåå¹¶ãæè½¬çæä½ã
### 3. ä¸çº¢é»æ çæ¯è¾
çº¢é»æ ç平衡æ ä¹å¯ä»¥ç¨æ¥å®ç°ç´¢å¼ï¼ä½æ¯æä»¶ç³»ç»åæ°æ®åºç³»ç»æ®ééç¨ B+ Tree ä½ä¸ºç´¢å¼ç»æï¼ä¸»è¦æä»¥ä¸ä¸¤ä¸ªåå ï¼
ï¼ä¸ï¼æ´å°çæ£ç´¢æ¬¡æ°
å¹³è¡¡æ æ£ç´¢æ°æ®çæ¶é´å¤æåº¦çäºæ é« hï¼èæ é«å¤§è´ä¸º O(h)=O(logdN)ï¼å
¶ä¸ d 为æ¯ä¸ªèç¹çåºåº¦ã
çº¢é»æ çåºåº¦ä¸º 2ï¼è B+ Tree çåºåº¦ä¸è¬é½é常大ãçº¢é»æ çæ é« h å¾ææ¾æ¯ B+ Tree 大é常å¤ï¼å æ¤æ£ç´¢ç次æ°ä¹å°±æ´å¤ã
ï¼äºï¼å©ç¨è®¡ç®æºé¢è¯»ç¹æ§
为äºåå°ç£ç I/Oï¼ç£çå¾å¾ä¸æ¯ä¸¥æ ¼æé读åï¼èæ¯æ¯æ¬¡é½ä¼é¢è¯»ãè¿æ ·åççè®ºä¾æ®æ¯è®¡ç®æºç§å¦ä¸èåçå±é¨æ§åçï¼å½ä¸ä¸ªæ°æ®è¢«ç¨å°æ¶ï¼å
¶éè¿çæ°æ®ä¹é常ä¼é©¬ä¸è¢«ä½¿ç¨ãé¢è¯»è¿ç¨ä¸ï¼ç£çè¿è¡é¡ºåºè¯»åï¼é¡ºåºè¯»åä¸éè¦è¿è¡ç£ç寻éï¼å¹¶ä¸åªéè¦å¾ççæè½¬æ¶é´ï¼å æ¤é度ä¼é常快ã
æä½ç³»ç»ä¸è¬å°å
ååç£çåå²æåºæå¤§å°çåï¼æ¯ä¸å称为ä¸é¡µï¼å
åä¸ç£ç以页为åä½äº¤æ¢æ°æ®ãæ°æ®åºç³»ç»å°ç´¢å¼çä¸ä¸ªèç¹ç大å°è®¾ç½®ä¸ºé¡µç大å°ï¼ä½¿å¾ä¸æ¬¡ I/O å°±è½å®å
¨è½½å
¥ä¸ä¸ªèç¹ï¼å¹¶ä¸å¯ä»¥å©ç¨é¢è¯»ç¹æ§ï¼ç¸é»çèç¹ä¹è½å¤è¢«é¢å
è½½å
¥ã
## ç´¢å¼åç±»
### 1. B+Tree ç´¢å¼
B+Tree ç´¢å¼æ¯å¤§å¤æ° MySQL åå¨å¼æçé»è®¤ç´¢å¼ç±»åã
å 为ä¸åéè¦è¿è¡å
¨è¡¨æ«æï¼åªéè¦å¯¹æ è¿è¡æç´¢å³å¯ï¼å æ¤æ¥æ¾é度快å¾å¤ãé¤äºç¨äºæ¥æ¾ï¼è¿å¯ä»¥ç¨äºæåºååç»ã
å¯ä»¥æå®å¤ä¸ªåä½ä¸ºç´¢å¼åï¼å¤ä¸ªç´¢å¼åå
±åç»æé®ã
B+Tree ç´¢å¼éç¨äºå
¨é®å¼ãé®å¼èå´åé®åç¼æ¥æ¾ï¼å
¶ä¸é®åç¼æ¥æ¾åªéç¨äºæå·¦åç¼æ¥æ¾ã
妿䏿¯æç
§ç´¢å¼åç顺åºè¿è¡æ¥æ¾ï¼åæ æ³ä½¿ç¨ç´¢å¼ã
InnoDB ç B+Tree ç´¢å¼å为主索å¼åè¾
å©ç´¢å¼ã
主索å¼çå¶åèç¹ data åè®°å½ç宿´çæ°æ®è®°å½ï¼è¿ç§ç´¢å¼æ¹å¼è¢«ç§°ä¸ºèç°ç´¢å¼ãå ä¸ºæ æ³ææ°æ®è¡åæ¾å¨ä¸¤ä¸ªä¸åçå°æ¹ï¼æä»¥ä¸ä¸ªè¡¨åªè½æä¸ä¸ªèç°ç´¢å¼ã
è¾
å©ç´¢å¼çå¶åèç¹ç data åè®°å½ç主é®çå¼ï¼å æ¤å¨ä½¿ç¨è¾
å©ç´¢å¼è¿è¡æ¥æ¾æ¶ï¼éè¦å
æ¥æ¾å°ä¸»é®å¼ï¼ç¶ååå°ä¸»ç´¢å¼ä¸è¿è¡æ¥æ¾ã
### 2. åå¸ç´¢å¼
InnoDB 弿æä¸ä¸ªç¹æ®çåè½å«âèªéåºåå¸ç´¢å¼âï¼å½æä¸ªç´¢å¼å¼è¢«ä½¿ç¨çé常é¢ç¹æ¶ï¼ä¼å¨ B+Tree ç´¢å¼ä¹ä¸åå建ä¸ä¸ªåå¸ç´¢å¼ï¼è¿æ ·å°±è®© B+Tree ç´¢å¼å
·æåå¸ç´¢å¼çä¸äºä¼ç¹ï¼æ¯å¦å¿«éçå叿¥æ¾ã
åå¸ç´¢å¼è½ä»¥ O(1) æ¶é´è¿è¡æ¥æ¾ï¼ä½æ¯å¤±å»äºæåºæ§ï¼å®å
·æä»¥ä¸éå¶ï¼
- æ æ³ç¨äºæåºä¸åç»ï¼
- åªæ¯æç²¾ç¡®æ¥æ¾ï¼æ æ³ç¨äºé¨åæ¥æ¾åèå´æ¥æ¾ï¼
### 3. å
¨æç´¢å¼
MyISAM åå¨å¼ææ¯æå
¨æç´¢å¼ï¼ç¨äºæ¥æ¾ææ¬ä¸çå
³é®è¯ï¼è䏿¯ç´æ¥æ¯è¾æ¯å¦ç¸çãæ¥æ¾æ¡ä»¶ä½¿ç¨ MATCH AGAINSTï¼è䏿¯æ®éç WHEREã
å
¨æç´¢å¼ä¸è¬ä½¿ç¨åæç´¢å¼å®ç°ï¼å®è®°å½çå
³é®è¯å°å
¶æå¨ææ¡£çæ å°ã
InnoDB åå¨å¼æå¨ MySQL 5.6.4 çæ¬ä¸ä¹å¼å§æ¯æå
¨æç´¢å¼ã
### 4. ç©ºé´æ°æ®ç´¢å¼ï¼R-Treeï¼
MyISAM åå¨å¼ææ¯æç©ºé´æ°æ®ç´¢å¼ï¼å¯ä»¥ç¨äºå°çæ°æ®åå¨ãç©ºé´æ°æ®ç´¢å¼ä¼ä»ææç»´åº¦æ¥ç´¢å¼æ°æ®ï¼å¯ä»¥ææå°ä½¿ç¨ä»»æç»´åº¦æ¥è¿è¡ç»åæ¥è¯¢ã
å¿
é¡»ä½¿ç¨ GIS ç¸å
³ç彿°æ¥ç»´æ¤æ°æ®ã
## ç´¢å¼çä¼ç¹
- 大大åå°äºæå¡å¨éè¦æ«æçæ°æ®è¡æ°ã
- 叮婿å¡å¨é¿å
è¿è¡æåºåå建临æ¶è¡¨ï¼B+Tree ç´¢å¼æ¯æåºçï¼å¯ä»¥ç¨æ¥å ORDER BY å GROUP BY æä½ï¼ï¼
- å°éæº I/O åä¸ºé¡ºåº I/Oï¼B+Tree ç´¢å¼æ¯æåºçï¼ä¹å°±å°ç¸é»çæ°æ®é½åå¨å¨ä¸èµ·ï¼ã
## ç´¢å¼ä¼å
### 1. ç¬ç«çå
å¨è¿è¡æ¥è¯¢æ¶ï¼ç´¢å¼åä¸è½æ¯è¡¨è¾¾å¼çä¸é¨åï¼ä¹ä¸è½æ¯å½æ°çåæ°ï¼å¦åæ æ³ä½¿ç¨ç´¢å¼ã
ä¾å¦ä¸é¢çæ¥è¯¢ä¸è½ä½¿ç¨ actor_id åçç´¢å¼ï¼
```sql
SELECT actor_id FROM sakila.actor WHERE actor_id + 1 = 5;
```
### 2. å¤åç´¢å¼
å¨éè¦ä½¿ç¨å¤ä¸ªåä½ä¸ºæ¡ä»¶è¿è¡æ¥è¯¢æ¶ï¼ä½¿ç¨å¤åç´¢å¼æ¯ä½¿ç¨å¤ä¸ªååç´¢å¼æ§è½æ´å¥½ãä¾å¦ä¸é¢çè¯å¥ä¸ï¼æå¥½æ actor_id å film_id 设置为å¤åç´¢å¼ã
```sql
SELECT film_id, actor_ id FROM sakila.film_actor
WHERE actor_id = 1 AND film_id = 1;
```
### 3. ç´¢å¼åç顺åº
è®©éæ©æ§æå¼ºçç´¢å¼åæ¾å¨åé¢ï¼ç´¢å¼çéæ©æ§æ¯æï¼ä¸éå¤çç´¢å¼å¼åè®°å½æ»æ°çæ¯å¼ãæå¤§å¼ä¸º 1ï¼æ¤æ¶æ¯ä¸ªè®°å½é½æå¯ä¸çç´¢å¼ä¸å
¶å¯¹åºãéæ©æ§è¶é«ï¼æ¥è¯¢æçä¹è¶é«ã
ä¾å¦ä¸é¢æ¾ç¤ºçç»æä¸ customer_id çéæ©æ§æ¯ staff_id æ´é«ï¼å æ¤æå¥½æ customer_id åæ¾å¨å¤åç´¢å¼çåé¢ã
```sql
SELECT COUNT(DISTINCT staff_id)/COUNT(*) AS staff_id_selectivity,
COUNT(DISTINCT customer_id)/COUNT(*) AS customer_id_selectivity,
COUNT(*)
FROM payment;
```
```html
staff_id_selectivity: 0.0001
customer_id_selectivity: 0.0373
COUNT(*): 16049
```
### 4. åç¼ç´¢å¼
å¯¹äº BLOBãTEXT å VARCHAR ç±»åçåï¼å¿
须使ç¨åç¼ç´¢å¼ï¼åªç´¢å¼å¼å§çé¨åå符ã
对äºåç¼é¿åº¦çéåéè¦æ ¹æ®ç´¢å¼éæ©æ§æ¥ç¡®å®ã
### 5. è¦çç´¢å¼
ç´¢å¼å
嫿æéè¦æ¥è¯¢çåæ®µçå¼ã
å
·æä»¥ä¸ä¼ç¹ï¼
- å ä¸ºç´¢å¼æ¡ç®é常è¿å°äºæ°æ®è¡ç大å°ï¼æä»¥è¥åªè¯»åç´¢å¼ï¼è½å¤§å¤§åå°æ°æ®è®¿é®éã
- ä¸äºåå¨å¼æï¼ä¾å¦ MyISAMï¼å¨å
åä¸åªç¼åç´¢å¼ï¼èæ°æ®ä¾èµäºæä½ç³»ç»æ¥ç¼åãå æ¤ï¼åªè®¿é®ç´¢å¼å¯ä»¥ä¸ä½¿ç¨ç³»ç»è°ç¨ï¼é常æ¯è¾è´¹æ¶ï¼ã
- å¯¹äº InnoDB 弿ï¼è¥è¾
å©ç´¢å¼è½å¤è¦çæ¥è¯¢ï¼åæ é访é®ä¸»ç´¢å¼ã
# åãæ¥è¯¢æ§è½ä¼å
## ä½¿ç¨ Explain è¿è¡åæ
Explain ç¨æ¥åæ SELECT æ¥è¯¢è¯å¥ï¼å¼å人åå¯ä»¥éè¿åæ Explain ç»ææ¥ä¼åæ¥è¯¢è¯å¥ã
æ¯è¾éè¦çåæ®µæï¼
- select_type : æ¥è¯¢ç±»åï¼æç®åæ¥è¯¢ãèåæ¥è¯¢ãåæ¥è¯¢ç
- key : 使ç¨çç´¢å¼
- rows : æ«æçè¡æ°
æ´å¤å
容请åèï¼[MySQL æ§è½ä¼åç¥å¨ Explain 使ç¨åæ](https://segmentfault.com/a/1190000008131735)
## ä¼åæ°æ®è®¿é®
### 1. åå°è¯·æ±çæ°æ®é
ï¼ä¸ï¼åªè¿åå¿
è¦çå
æå¥½ä¸è¦ä½¿ç¨ SELECT * è¯å¥ã
ï¼äºï¼åªè¿åå¿
è¦çè¡
ä½¿ç¨ WHERE è¯å¥è¿è¡æ¥è¯¢è¿æ»¤ï¼ææ¶åä¹éè¦ä½¿ç¨ LIMIT è¯å¥æ¥éå¶è¿åçæ°æ®ã
ï¼ä¸ï¼ç¼åé夿¥è¯¢çæ°æ®
使ç¨ç¼åå¯ä»¥é¿å
卿°æ®åºä¸è¿è¡æ¥è¯¢ï¼ç¹å«è¦æ¥è¯¢çæ°æ®ç»å¸¸è¢«é夿¥è¯¢ï¼ç¼åå¯ä»¥å¸¦æ¥çæ¥è¯¢æ§è½æåå°ä¼æ¯éå¸¸ææ¾çã
### 2. åå°æå¡å¨ç«¯æ«æçè¡æ°
æææçæ¹å¼æ¯ä½¿ç¨ç´¢å¼æ¥è¦çæ¥è¯¢ã
## éææ¥è¯¢æ¹å¼
### 1. åå大æ¥è¯¢
ä¸ä¸ªå¤§æ¥è¯¢å¦æä¸æ¬¡æ§æ§è¡çè¯ï¼å¯è½ä¸æ¬¡éä½å¾å¤æ°æ®ãå æ»¡æ´ä¸ªäºå¡æ¥å¿ãè尽系ç»èµæºãé»å¡å¾å¤å°çä½éè¦çæ¥è¯¢ã
```sql
DELEFT FROM messages WHERE create < DATE_SUB(NOW(), INTERVAL 3 MONTH);
```
```sql
rows_affected = 0
do {
rows_affected = do_query(
"DELETE FROM messages WHERE create < DATE_SUB(NOW(), INTERVAL 3 MONTH) LIMIT 10000")
} while rows_affected > 0
```
### 2. åè§£å¤§è¿æ¥æ¥è¯¢
å°ä¸ä¸ªå¤§è¿æ¥æ¥è¯¢ï¼JOINï¼åè§£æå¯¹æ¯ä¸ä¸ªè¡¨è¿è¡ä¸æ¬¡å表æ¥è¯¢ï¼ç¶åå°ç»æå¨åºç¨ç¨åºä¸è¿è¡å
³èï¼è¿æ ·åç好夿ï¼
- 让ç¼åæ´é«æã对äºè¿æ¥æ¥è¯¢ï¼å¦æå
¶ä¸ä¸ä¸ªè¡¨åçååï¼é£ä¹æ´ä¸ªæ¥è¯¢ç¼åå°±æ æ³ä½¿ç¨ãèåè§£åçå¤ä¸ªæ¥è¯¢ï¼å³ä½¿å
¶ä¸ä¸ä¸ªè¡¨åçååï¼å¯¹å
¶å®è¡¨çæ¥è¯¢ç¼åä¾ç¶å¯ä»¥ä½¿ç¨ã
- åè§£æå¤ä¸ªå表æ¥è¯¢ï¼è¿äºå表æ¥è¯¢çç¼åç»ææ´å¯è½è¢«å
¶å®æ¥è¯¢ä½¿ç¨å°ï¼ä»èåå°åä½è®°å½çæ¥è¯¢ã
- åå°éç«äºï¼
- å¨åºç¨å±è¿è¡è¿æ¥ï¼å¯ä»¥æ´å®¹æå¯¹æ°æ®åºè¿è¡æåï¼ä»èæ´å®¹æåå°é«æ§è½å坿©å±ã
- æ¥è¯¢æ¬èº«æçä¹å¯è½ä¼æææåãä¾å¦ä¸é¢çä¾åä¸ï¼ä½¿ç¨ IN() 代æ¿è¿æ¥æ¥è¯¢ï¼å¯ä»¥è®© MySQL æç
§ ID 顺åºè¿è¡æ¥è¯¢ï¼è¿å¯è½æ¯éæºçè¿æ¥è¦æ´é«æã
```sql
SELECT * FROM tab
JOIN tag_post ON tag_post.tag_id=tag.id
JOIN post ON tag_post.post_id=post.id
WHERE tag.tag='mysql';
```
```sql
SELECT * FROM tag WHERE tag='mysql';
SELECT * FROM tag_post WHERE tag_id=1234;
SELECT * FROM post WHERE post.id IN (123,456,567,9098,8904);
```
# äºãåå
## æ°´å¹³åå
æ°´å¹³ååå称为 Shardingï¼å®æ¯å°åä¸ä¸ªè¡¨ä¸çè®°å½æåå°å¤ä¸ªç»æç¸åç表ä¸ã
å½ä¸ä¸ªè¡¨çæ°æ®ä¸æå¢å¤æ¶ï¼Sharding æ¯å¿
ç¶çéæ©ï¼å®å¯ä»¥å°æ°æ®åå¸å°é群çä¸åèç¹ä¸ï¼ä»èç¼ååä¸ªæ°æ®åºçååã
## åç´åå
åç´å忝å°ä¸å¼ 表æåååæå¤ä¸ªè¡¨ï¼éå¸¸æ¯æç
§åçå
³ç³»å¯éç¨åº¦è¿è¡ååï¼ä¹å¯ä»¥å©ç¨åç´ååå°ç»å¸¸è¢«ä½¿ç¨çååä¸ç»å¸¸è¢«ä½¿ç¨çåååå°ä¸åç表ä¸ã
卿°æ®åºçå±é¢ä½¿ç¨åç´ååå°ææ°æ®åºä¸è¡¨çå¯éç¨åº¦é¨ç½²å°ä¸åçåºä¸ï¼ä¾å¦å°åæ¥ççµåæ°æ®åºåç´ååæååæ°æ®åº payDBãç¨æ·æ°æ®åº userDB çã
## Sharding çç¥
- åå¸å模ï¼hash(key) % NUM_DB
- èå´ï¼å¯ä»¥æ¯ ID èå´ä¹å¯ä»¥æ¯æ¶é´èå´
- æ å°è¡¨ï¼ä½¿ç¨åç¬çä¸ä¸ªæ°æ®åºæ¥å卿 å°å
³ç³»
## Sharding åå¨çé®é¢åè§£å³æ¹æ¡
### 1. äºå¡é®é¢
使ç¨åå¸å¼äºå¡æ¥è§£å³ï¼æ¯å¦ XA æ¥å£ã
### 2. JOIN
å¯ä»¥å°åæ¥ç JOIN æ¥è¯¢åè§£æå¤ä¸ªå表æ¥è¯¢ï¼ç¶åå¨ç¨æ·ç¨åºä¸è¿è¡ JOINã
### 3. ID å¯ä¸æ§
- 使ç¨å
¨å±å¯ä¸ IDï¼GUIDã
- 为æ¯ä¸ªåçæå®ä¸ä¸ª ID èå´ã
- åå¸å¼ ID çæå¨ (å¦ Twitter ç Snowflake ç®æ³)ã
æ´å¤å
容请åèï¼
- [How Sharding Works](https://medium.com/@jeeyoungk/how-sharding-works-b4dec46b3f6)
- [大ä¼ç¹è¯è®¢åç³»ç»ååºå表å®è·µ](https://tech.meituan.com/dianping_order_db_sharding.html)
# å
ãå¤å¶
## 主ä»å¤å¶
ä¸»è¦æ¶åä¸ä¸ªçº¿ç¨ï¼binlog 线ç¨ãI/O 线ç¨å SQL 线ç¨ã
- **binlog 线ç¨** ï¼è´è´£å°ä¸»æå¡å¨ä¸çæ°æ®æ´æ¹åå
¥äºè¿å¶æä»¶ï¼binlogï¼ä¸ã
- **I/O 线ç¨** ï¼è´è´£ä»ä¸»æå¡å¨ä¸è¯»åäºè¿å¶æ¥å¿æä»¶ï¼å¹¶åå
¥ä»æå¡å¨çä¸ç»§æ¥å¿ä¸ã
- **SQL 线ç¨** ï¼è´è´£è¯»åä¸ç»§æ¥å¿å¹¶éæ¾å
¶ä¸ç SQL è¯å¥ã
## 读åå离
主æå¡å¨ç¨æ¥å¤çåæä½ä»¥å宿¶æ§è¦æ±æ¯è¾é«ç读æä½ï¼è仿å¡å¨ç¨æ¥å¤ç读æä½ã
读åå离常ç¨ä»£çæ¹å¼æ¥å®ç°ï¼ä»£çæå¡å¨æ¥æ¶åºç¨å±ä¼ æ¥ç读å请æ±ï¼ç¶åå³å®è½¬åå°åªä¸ªæå¡å¨ã
MySQL 读ååç¦»è½æé«æ§è½çåå å¨äºï¼
- 䏻仿å¡å¨è´è´£åèªç读ååï¼æå¤§ç¨åº¦ç¼è§£äºéçäºç¨ï¼
- 仿å¡å¨å¯ä»¥é
ç½® MyISAM å¼æï¼æåæ¥è¯¢æ§è½ä»¥åè约系ç»å¼éï¼
- å¢å åä½ï¼æé«å¯ç¨æ§ã
# åèèµæ
- BaronScbwartz, PeterZaitsev, VadimTkacbenko, ç. 髿§è½ MySQL[M]. çµåå·¥ä¸åºç社, 2013.
- å§æ¿å°§. MySQL ææ¯å
å¹: InnoDB åå¨å¼æ [M]. æºæ¢°å·¥ä¸åºç社, 2011.
- [20+ æ¡ MySQL æ§è½ä¼åçæä½³ç»éª](https://www.jfox.info/20-tiao-mysql-xing-nen-you-hua-de-zui-jia-jing-yan.html)
- [æå¡ç«¯æå æ°æ®åå¨ç¯ | MySQLï¼09ï¼ ååºä¸å表带æ¥çåå¸å¼å°å¢ä¸åºå¯¹ä¹ç](http://blog.720ui.com/2017/mysql_core_09_multi_db_table2/ "æå¡ç«¯æå æ°æ®åå¨ç¯ | MySQLï¼09ï¼ ååºä¸å表带æ¥çåå¸å¼å°å¢ä¸åºå¯¹ä¹ç")
- [How to create unique row ID in sharded databases?](https://stackoverflow.com/questions/788829/how-to-create-unique-row-id-in-sharded-databases)
- [SQL Azure Federation â Introduction](http://geekswithblogs.net/shaunxu/archive/2012/01/07/sql-azure-federation-ndash-introduction.aspx "Title of this entry.")
- [MySQL ç´¢å¼èåçæ°æ®ç»æåç®æ³åç](http://blog.codinglabs.org/articles/theory-of-mysql-index.html)
---
github: https://github.com/sjsdfg/Interview-Notebook-PDF