MySQL çç´¢å¼æ¯ä¸ç§å¸®å© MySQL é«æè·åæ°æ®çç»æãç±äºç£ç IO æ¯è¾èæ¶ï¼æ以 MySQL éè¿å»ºç«ç´¢å¼æ¥åå°ç£ç IO ç次æ°è¿èæåæ¥è¯¢æ°æ®çæçãéè¿ç´¢å¼ç¼©å°è·åæ°æ®çèå´ï¼åå°æ°æ®çéçè¿ç¨çæ¶é´æ¶èã
ç´¢å¼ç»ææ¢ç´¢
éæ©ä¸ç§éå MySQL çç´¢å¼ç»æï¼å¦ä½éæ©ç»æ使å¾æ¥è¯¢ç¨æå°çç£ç IO 次æ°ï¼è·å¾ç®æ æ°æ®ã顺åºæ¥è¯¢å¨æ°æ®é大çæ¶åæ¾ç¶æ¯ä¸åéçï¼éè¦å¯»æ¾å ¶ä»åéçç»æã
Data Structure Visualization (usfca.edu) è¿ä¸ªé¾æ¥å¯ä»¥è¿è¡åç§æ°æ®ç»æçå¯è§å
åå¸è¡¨
ä¼å¿ï¼åå¸è¡¨å¯ä»¥å¿«éæ¥è¯¢ï¼æ¥è¯¢æçé«
å£å¿ï¼å½åºç°å¤§ééå¤é®æ¶ï¼åå¨åå¸å²çªï¼æ°æ®æåºã模ç³æ¥è¯¢é¾ä»¥å®ç°
äºåæ¥æ¾æ
ä¼å¿ï¼å¯ä»¥ä½¿ç¨äºåæ¥æ¾æé«æç
å£å¿ï¼å¨æ端æ åµä¸ä¼éåæååé¾è¡¨ï¼æ¥è¯¢æçä½
äºåæ¥æ¾æ ä¸éåä½ä¸ºç´¢å¼çç»æ
平衡äºåæ¥æ¾æ ï¼AVL Treeï¼
ä¼å¿ï¼è§å®äºå·¦åæ åå³åæ çé«åº¦å·®å¼ä¸è½å¤§äº 1ï¼å·®å¼è¶ åº 1 æ¶æ ä¼è¿è¡èªå¹³è¡¡ï¼é¿å äºåºç°éåæååé¾è¡¨çæ åµ
å£å¿ï¼ç±äºç»ç¹ç度太å°ï¼å¯¼è´æ°æ®éé常大çæ¶åï¼æ 深度ä¼åå¾å¾æ·±ï¼æ·±åº¦è¶æ·±ï¼ç£ç IO 次æ°è¶å¤ï¼æçè¶ä½
平衡äºåæ¥æ¾æ ä¹ä¸éåä½ä¸ºç´¢å¼çç»æ
å¤è·¯å¹³è¡¡æ¥æ¾æ ï¼B Treeï¼
å两个ç»æçæ ¸å¿é®é¢ç¹å°±æ¯æ ç深度ï¼æ ç深度åç£ç IO 次æ°æ¯æ¯ç¸å ³
B Tree æ大çç¹ç¹æ¯ä¸ä¸ªèç¹çåº¦æ° = ä¸ä¸ªèç¹çå ³é®åæ° + 1ï¼å ³é®åæ°è¶å¤ï¼åº¦è¶å¤ï¼æ 深度è¶å°ï¼IO 次æ°è¶å°
B Tree ç»æå¾ï¼å设æ大度æ°ä¸º 3 ï¼ï¼
B Tree å·¥ä½åç
B Tree ä¸ä¸ªèç¹åå¨å¤ä¸ªå ³é®åï¼æ¯éè¿åè£ãå并è¿ä¸¤ç§æ¹å¼æ¥ä¿è¯æ ç平衡æ§ç
- åè£ï¼å½ä¸ä¸ªèç¹çå ³é®åæ°éçäºæ大度æ°æ¶ï¼èç¹éè¦åè£æ¥ä¿è¯å¹³è¡¡
- å并ï¼å½ä¸ä¸ªèç¹åçåè£è产çä¸ä¸ªç¶çº§èç¹ï¼ä¸åç¶çº§èç¹å·²æå ³é®åï¼é£ä¹è¿ä¸¤ä¸ªèç¹å¯ä»¥æ ¹æ®ä¸è¶ è¿æ大度æ°çè§åæ¥å并称为ä¸ä¸ªç¶çº§èç¹
B Tree å¨ MySQL ä¸çå®ç°
B Tree ä¸çèç¹ï¼å¨ MySQL ä¸ä»£è¡¨çæ¯ Page æ°æ®é¡µ
ä¼å¿ï¼B Tree 解å³äº AVL Tree åªæ两个度çé®é¢ï¼B Tree çèç¹å¯ä»¥æå¾å¤ç度ï¼è½ææ解å³æ°æ®é大çæ¶åæ 深度è¿æ·±å¯¼è´ç£ç IO 次æ°è¿å¤çé®é¢ã
å£å¿ï¼B Tree å¨æ°æ®æå ¥ä¸å é¤çæ¶åï¼ä¼ç ´å B Tree èªèº«ç平衡ï¼ä¸å¾ä¸ä½¿ç¨å并ä¸åè£æ¥ä¿è¯å¹³è¡¡ï¼ç±äº B Tree èç¹ä¸ä» åå¨ç´¢å¼ä¹åå¨æ°æ®åºï¼æ以导è´å并ãåè£ç»ç¹çæä½æçä¸é«ï¼å¨èç¹æ°éè¾å¤çæ åµä¸æ§è½å½±å大ï¼å¹¶ä¸ææèç¹é½åå¨æ°æ®ï¼ä¼å¯¼è´æ°æ®æ¥è¯¢çæ¶é´ä¸ç¨³å®ã
å 强çå¤è·¯å¹³è¡¡æ¥æ¾æ ï¼B+ Treeï¼
MySQL ä¸ InnoDB 没æç´æ¥ä½¿ç¨ B Treeï¼èæ¯å¯¹ B Tree åäºå¼ºåï¼ä½¿ç¨äºä¸ç§ B+ Tree çç»ææ¥åå¨ç´¢å¼
B+ Tree çç»æå¾ï¼
B+ Tree çå·¥ä½åç
为äºä¿è¯æ ç平衡æ§ï¼B+ Tree ä¹å B Tree ä¸æ ·éç¨äºåè£ãå并çæä½æ¥ä¿è¯èªèº«å¹³è¡¡
æ¤å¤æ¯ä¸ä¸ªå¶åç»ç¹é½æä¸ä¸ªæåç¸é»å¶åç»ç¹çæéï¼å½¢æä¸ä¸ªæåºé¾è¡¨
B+ Tree å¨ MySQL ä¸çå®ç°
B+ Tree ä¸çèç¹ï¼å¨ MySQL ä¸ä»£è¡¨çæ¯ Page æ°æ®é¡µï¼æ以 B+ Tree ä¸ä¸ä¸ªèç¹ç大å°æ¯ 16 KBï¼éå¶åç»ç¹åå¨ç´¢å¼æ°æ®åä¸ä¸ä¸ªç»ç¹çå°åï¼å æ¤B+ Tree ç深度å度æ°ç±ç´¢å¼æ°æ®å¤§å°æ¥å³å®
B+ Tree ç¹ç¹ï¼
- B+ Tree èç¹çå ³é®åå度æ°çå ³ç³»æ¯ 1 : 1
- B+ Tree èç¹çæ°æ®æ£ç´¢è§ååæäºå·¦éå³å¼çè§å
- B+ Tree åªæå¶åç»ç¹åå¨æ°æ®ï¼å ¶ä»èç¹é½åªåå¨å ³é®åç´¢å¼
- B+ Tree çå¶åç»ç¹é½ä¼ææåä¸ä¸ä¸ªåä¸ä¸ä¸ªå¶åç»ç¹çæéï¼å½¢æä¸ä¸ªæåºååé¾è¡¨ï¼æ¹ä¾¿ååºé´æ¥è¯¢
B+ Tree å B Tree åºå«
- åå¨å 容ï¼B Tree ææèç¹é½åå¨ç´¢å¼åæ°æ®ï¼B+ Tree åªæå¶åç»ç¹æåå¨æ°æ®ï¼éå¶åç»ç¹åªåå¨ç´¢å¼å ³é®å
- æç´¢è§åï¼B Tree çåæ åºé´æ¶ä¸å å«å ³é®åçï¼B+ Tree æ¯å·¦éå³å¼åºé´ãæ¯å 为 B+ Tree ä¸çéå¶åç»ç¹ä¸åå¨æ°æ®ï¼æ°æ®é½å¨å¶åç»ç¹ä¸
- B+ æ çå¶åç»ç¹æ¯é¡ºåºæåçï¼ä½¿å¾å ¨è¡¨æ«ææ¶çæçä¼æ´é«
为ä»ä¹ MySQL éæ© B+ Tree ä½ä¸ºç´¢å¼çåå¨ç»æ
ææ ¹æ¬çèèä¸å®æ¯æ§è½
- æ«è¡¨è½åæ´å¼ºï¼å¯¹ B+ Tree è¿è¡å ¨è¡¨æ«ææ¶ï¼åªéè¦æ«æåå¨æ°æ®çå¶åç»ç¹ï¼ä¸éè¦éåæ´æ£µæ çç»ç¹
- æåºè½åæ´å¼ºï¼å 为 B+ Tree ä¸çå¶åç»ç¹ææåä¸ä¸ä¸ªåä¸ä¸ä¸ªå¶åç»ç¹çæéï¼æ°æ®å½¢æä¸ä¸ªæåºé¾è¡¨
- æ¥è¯¢æçæ´ç¨³å®ï¼å 为 B+ Tree åªæå¶åç»ç¹åå¨äºæ°æ®ï¼æ以ç£ç IO 次æ°æ¯ç¨³å®çï¼è B Tree æ¯ä¸ä¸ªèç¹é½åå¨æ°æ®ï¼æ¥è¯¢ç IO 次æ°ä¼ä¸ç¨³å®
- 度æ°æ´å¤ï¼B+ Tree çç»ç¹ä¸éè¦åå¨æ°æ®ï¼åªéè¦åå¨ç´¢å¼åæéï¼ä¸æ¬¡å è½½çå ³é®åæ°éæ´å¤äºï¼æ以度æ°æ´å¤
åå¨å¼æçç´¢å¼å®ç°
MyISAM
å¨ä½¿ç¨ MyISAM åå¨å¼æç表ä¼åå«æä¸ä¸ªæ件ï¼
.sid
ï¼è¡¨ç»æï¼ã
.MYI
ï¼ç´¢å¼ï¼ã
.MYD
ï¼æ°æ®ï¼
ä¸ä¸ªç´¢å¼å¯¹åºä¸æ£µ B+ Treeï¼ææç B+ Tree é½åå¨å¨ MYI æ件è¿éï¼å¨ MYI æ件ä¸æ¾å°ç´¢å¼å¼å¯¹åºæ°æ®çç£çå°åååä» MYD æ件ä¸æ¾å°å®æ´çæ°æ®
å¨ MyISAM åå¨å¼æä¸ï¼ä¸»é®ç´¢å¼åæ®éç´¢å¼å¨ç»æä¸æ²¡æåºå«ï¼å¶åç»ç¹ç»ä¸åå¨çæ¯æ°æ®çç£çå°åï¼åªæ¯ä¸»é®ç´¢å¼è¦æ±å ³é®åæ¯å¯ä¸ç
InnoDB
å¨ä½¿ç¨ InnoDB åå¨å¼æç表åªæä¸ä¸ªæ件ï¼
.idb
ï¼åå¨ç´¢å¼åæ°æ®ï¼
InnoDB æç´¢å¼ååæ两大类ï¼èç°ç´¢å¼ãéèç°ç´¢å¼
- èç°ç´¢å¼ï¼èç°ç´¢å¼ä¸ç´¢å¼é®å¼çé»è¾é¡ºåºå表æ°æ®è¡çç©ç顺åºæ¯ä¸è´çãèç°ç´¢å¼ä¸éå¶åç»ç¹åå¨çæ¯ç´¢å¼å ³é®åï¼å¶åç»ç¹åå¨çæ¯æ°æ®ãInnoDB ä¸ç´¢å¼åæ°æ®é½åå¨å¨ä¸ä¸ªæ件ä¸ï¼æ¯å 为æ°æ®æ¯éè¿èç°ç´¢å¼æ¥ç»ç»è¡¨çï¼InnoDB ä¸ç主é®ç´¢å¼å°±æ¯èç°ç´¢å¼ã
- éèç°ç´¢å¼ï¼é¤äºèç°ç´¢å¼å¤ï¼å ¶ä»ææç´¢å¼é½æ¯éèç°ç´¢å¼ãéèç°ç´¢å¼ä¸çéå¶åç»ç¹åå¨çæ¯ç´¢å¼ï¼å¶åç»ç¹åå¨çæ¯å¯¹åºæ°æ®è¡ç主é®ï¼å æ¤éè¿éèç°ç´¢å¼æ¥è¯¢æ°æ®æ¶éè¦è¿è¡å表ï¼æ¶åå°ä¸¤æ¬¡æ¥æ¾ã
InnoDB 主é®ç´¢å¼åæ®éç´¢å¼çç»æï¼ä»¥åæ¥è¯¢æ°æ®çæ£ç´¢è·¯çº¿ï¼
MySQL ç´¢å¼åç±»
- NORMALï¼æ®éç´¢å¼ï¼ï¼å°±æ¯æ们平常å¨å段ä¸é¢å»ºçæ®éç´¢å¼
- UNIQUEï¼å¯ä¸ç´¢å¼ï¼ï¼å¨æ®éç´¢å¼çåºç¡ä¸è¦æ±å段ä¸å 许æéå¤å¼ï¼ä½å¯ä»¥æå¤ä¸ª NULL å¼
- FULLTEXTï¼å ¨æç´¢å¼ï¼ï¼éåæ¯è¾å¤§éçæ°æ®å段ï¼æ¯å¦åå¨ä¸äºæç« ç±»æé¿ææ¬ç±»çæ°æ®ï¼å¯ä»¥åºäºå ¨æä¸æäºå ³é®åè¿è¡ç´¢å¼æ¥è¯¢
- SPATIALï¼ç©ºé´ç´¢å¼ï¼ï¼ç©ºé´ç´¢å¼æ¯å¯¹ç©ºé´æ°æ®ç±»åçå段建ç«çç´¢å¼ï¼å¸¸è§æå°çåæ æ°æ®çï¼ç 究è¾å°
ç´¢å¼å建è§å
å 为索å¼å¯¹äºæ¹åæ¥è¯¢æ§è½çä½ç¨æ¯å·¨å¤§çï¼ä½åæ¶ç´¢å¼ä¹ä¼å¸¦æ¥ç©ºé´ä¸çè´æ ï¼æ以æ³è¦æ£ç¡®å°å建索å¼ï¼éè¦éµå¾ªä¸å®çè§åã
- ä¸è¬éæ©å¨ where æ¡ä»¶ãorder æåºãjoin è¿æ¥ãgroup by åç»çå段ä¸å»ºç«ç´¢å¼ï¼å 为è¿éæ¶åå°æ°æ®çæ¥è¯¢ä¸æåºï¼å¯ä»¥å ååæ¥ B+ Tree çä½ç¨ã
- ç´¢å¼çæ°éä¸å®è¿å¤ï¼ä¸ä¸ªè¡¨åºè¯¥å°½å¯è½ç²¾ç®ç´¢å¼çæ°éï¼å 为ä¸ä¸ªç´¢å¼å¯¹åºä¸æ£µ B+ Treeï¼ç´¢å¼å¤ªå¤ä¼æµªè´¹ç©ºé´ï¼æå ¥å é¤æ°æ®æ¶å¯è½æ¶å B+ Tree çåè£å并æä½ï¼å¯¼è´æ´æ°ç´¢å¼æ æçä½ã
- å¦æç´¢å¼å段è¾é¿ï¼åºè¯¥å»ºç«åç¼ç´¢å¼ãå 为索å¼å段太é¿ä¼å¯¼è´å ç¨ç空é´å¤ªå¤§ï¼è¿è¡ç´¢å¼å¹é æ¶ä¹éè¦è¿è¡æ´é¿çæ¶é´ï¼æ¤å¤ B+ Tree ä¸ä¸é¡µæ°æ®è½åå¨çç´¢å¼å ³é®åçæ°éä¹ä¸å¤ï¼å¯¼è´åº¦æ°ä¹å°ï¼è¿èå¯¼è´ B+ Tree ç深度åå¾å¾å¤§ãåç¼ç´¢å¼å建ç计ç®æ¹å¼ï¼mysqlç´¢å¼ä¹åç¼ç´¢å¼_ITPUBå客
- ç´¢å¼å¼åºè¯¥è¶³å¤ç¨³å®ï¼é¢ç¹æ´æ°çå段ä¸éååç´¢å¼ï¼å 为索å¼æ°æ®é¢ç¹å°æ´æ°ï¼B+ Tree éè¦ä¿æ平衡èè¿è¡ç»ç¹çåè£åå并ãéæ°æåºï¼è¿ä¸ªè°æ´çè¿ç¨æ¯éè¦èè´¹æ§è½çãå¦æè¿ä¸è¡æ°æ®æå ¥åï¼ç´¢å¼å¯¹åºçå段ä¸ç´ä¸ä¼è¢«ä¿®æ¹ï¼è¿ç§æ åµæ¯æ好çã
- ç´¢å¼å¯¹æ°æ®çåºå度åºè¯¥å°½å¯è½é«ï¼å¦æéå¤å¼å¤ªå¤ï¼åºå度太ä½ï¼ï¼MySQL ä¼è®¤ä¸ºä½¿ç¨ç´¢å¼åå表çå¼éè¿ä¸å¦ç´æ¥å ¨è¡¨æ«æçå¼é大ï¼åèä¼å¢å IO 次æ°ï¼å¾å¾ä¼éæ©å ¨è¡¨æ«æè¿ç§æ¹å¼ãæ°æ®éå¤çè¶å°è¶å¥½ï¼å¦æè¿ä¸åæ°æ®é½æ¯å¯ä¸çï¼é£ä¹è¿ä¸åå ç´¢å¼æ¯æ好çãæ¯å¦æ§å«è¿ç§æ°æ®å°±ä¸éåå ç´¢å¼ï¼åºå度é常ä½ã
- éæºæ åºçå¼ä¸éååç´¢å¼ï¼æ¯å¦ UUID å身份è¯è¿ç§éæºä¸æ åºçå¼ï¼å 为 B+ Tree çç´¢å¼æ¯æåºç»ç»çï¼æ以æ åºçæ°æ®æå ¥å é¤ä¹å°±æå³çéè¦é¢ç¹çåè£ä¸å并æä½ã
- å¦æå建ç»åç´¢å¼ï¼é£ä¹æåºå度æé«çåæ¾å¨åé¢ãå 为ç»åç´¢å¼ä¼æç §ä»å·¦å°å³ç顺åºå建索å¼å ³é®åï¼ç´¢å¼çå¹é éµå¾ªæå·¦å¹é ååã
ç´¢å¼å¤±æåºæ¯
å½ä¸æ¡ SQL è¯å¥æ§è¡å¾æ¯è¾æ ¢çæ¶åï¼éè¦å»çæ§è¡è®¡ååæåå ãå¦ææ¯å ¨è¡¨æ«ææè 没æ使ç¨ç´¢å¼ï¼é£ä¹å°±è¯´æ没æ建ç«ç´¢å¼æè 没ææ£ç¡®ä½¿ç¨ç´¢å¼çè³æ¯è¿ä¸ª SQL è¯å¥ç ´åäºç´¢å¼ç使ç¨è§å ã
- ç´¢å¼å使ç¨å½æ°ï¼replaceãconcatï¼ã表达å¼ï¼Â±*/ï¼ã
- ç´¢å¼ååçéå¼è½¬æ¢ãæ¯å¦ä¸ä¸ªç´¢å¼åæ¯ varchar ç±»åï¼ä½æ¯å¨æ¥è¯¢æ¶ SQL è¯å¥ä¸ä¼ å ¥äº int ç±»åçæ¡ä»¶ï¼è¿ç§åæ³åå¨ç±»å转åï¼ä¼å¯¼è´å ¨è¡¨æ«æã
- 模ç³æ¥è¯¢æ¶ä½¿ç¨ like % åç¼ãåå å B+ Tree ç´¢å¼ç»ææå ³ç³»ï¼ç´¢å¼å ³é®åé½æ¯ä»å·¦å¾å³æå¸çï¼å½åç¼æªç¥çæ¶åï¼å°±æ æ³å®ä½ç´¢å¼å ³é®åï¼å æ¤æ¥è¯¢æ¶åªè½è¿è¡å ¨è¡¨æ«æã
- ç´¢å¼åä½¿ç¨ not likeãå like % åç¼ä¸æ ·ï¼æç §æå·¦å¹é ååï¼æ æ³å®ä½ç´¢å¼å ³é®åã
ç´¢å¼è¿é¶ä½¿ç¨
ç´¢å¼è¦ç
使ç¨æ®éç´¢å¼æ¥æ¾æ°æ®çæµç¨æ¯å å¨æ®éç´¢å¼æ ä¸æ¥æ¾å°æ°æ®ç主é®ï¼åå»ä¸»é®ç´¢å¼æ ä¸æ¥æ¾å¯¹åºçæ°æ®ï¼è¿å ¶ä¸æä¸æ¬¡å表çè¿ç¨ã
ç´¢å¼è¦ççæ¦å¿µæ¯ï¼å¦æéè¦æ¥è¯¢çå段ååªå å«èåç´¢å¼åä¸çå段ï¼é£ä¹å¨æ®éç´¢å¼æ ä¸æ¥æ¾å°å ·ä½çç´¢å¼æ°æ®åï¼å 为ç»ç¹ä¸å å«äºèåç´¢å¼ä¸çå¤ä¸ªç´¢å¼æ°æ®ï¼ä»è¿ä¸ªç»ç¹ä¸ååºæéå段æ°æ®å³å¯ï¼æ éå表ãç´¢å¼è¦çå¾å¾åèåç´¢å¼ä¸èµ·ä½¿ç¨ï¼å 为åä¸ç´¢å¼æ²¡æç´¢å¼è¦ççæä¹ã
ä¾å¦ï¼æä¸ä¸ªèåç´¢å¼
index(f1, f2, f3)
ï¼æ¤æ¶ä½¿ç¨è¿ä¸ª SQL è¯å¥ï¼
select f1, f2, f3 from table1 where f1 = 'a'
ï¼é£ä¹åªéè¦æ§è¡ä¸æ¬¡ B+ Tree çæ æ¥æ¾ï¼ä¸éè¦å次å表ã
å¦æ使ç¨äºç´¢å¼è¦çï¼é£ä¹å¨æ§è¡è®¡åä¸ï¼
Extra
åä¸ä¼æ¾ç¤º
Using index
ã
ç´¢å¼æ¡ä»¶ä¸æ¨
ç´¢å¼æ¡ä»¶ä¸æ¨ï¼Index Condition Pushï¼çæ¦å¿µæ¯ï¼MySQL Server å±æä¸ç´¢å¼ç¸å ³çæ¡ä»¶ä¸æ¨ç»åå¨å¼æå±ï¼ç±åå¨å¼æå±åè¿ä¸æ¥çæ°æ®çéãæ ¸å¿çç®æ æ¯ï¼å°½å¯è½å°ä½¿ç¨ç´¢å¼æ¡ä»¶æ¥åå°å表æä½ï¼è¿èåå° IO æä½ã
没å¼å¯ç´¢å¼æ¡ä»¶ä¸æ¨å
- åå¨å¼ææ ¹æ®ç´¢å¼æ¡ä»¶å®ä½å¯¹åºç´¢å¼è®°å½åå ¶ä¸»é®å¼
- æ ¹æ®ä¸»é®å¼å»ä¸»é®ç´¢å¼æ ä¸å®ä½å¹¶è¯»åå®æ´çæ°æ®è¡
- ææ°æ®è¡äº¤ç» Server å±æ£æµæ¯å¦æ»¡è¶³ where æ¡ä»¶
æ§è¡è®¡åä¸ï¼
Extra
åä¸ä¼æ¾ç¤º
Using where
å¼å¯ç´¢å¼æ¡ä»¶ä¸æ¨å
- åå¨å¼ææ ¹æ®ç´¢å¼æ¡ä»¶å®ä½å¯¹åºå¯¹åºç´¢å¼è®°å½
- å¤æ where è¯å¥ä¸å ¶ä»æ¡ä»¶è½å¦ç¨ç´¢å¼è®°å½ä¸çåæ¥åæ£æ¥ï¼æ¡ä»¶ä¸æ»¡è¶³ï¼åå¤çä¸ä¸è¡ç´¢å¼è®°å½
- æ¡ä»¶æ»¡è¶³ï¼ä½¿ç¨ç´¢å¼ä¸ç主é®å¼å»ä¸»é®ç´¢å¼æ ä¸å®ä½å¹¶è¯»åå®æ´çæ°æ®è¡
- ææ°æ®è¡äº¤ç» Server å±ï¼Server å±æ£æµè¿äºæ°æ®è½å¦æ»¡è¶³ where æ¡ä»¶çå ¶ä½é¨å
æ§è¡è®¡åä¸ï¼
Extra
åä¸ä¼æ¾ç¤º
Using index condition
ç¸å ³åæ°
- æ¥çç¶æ
select @@optimizer_switch; -- ç»æ index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on,use_invisible_indexes=off,skip_scan=on,hash_join=on,subquery_to_derived=off,prefer_ordering_index=on
- åæ¢å¼å
³
set optimizer_switch="index_condition_pushdown=off"; set optimizer_switch="index_condition_pushdown=on";
使ç¨åºæ¯
建表è¯å¥
CREATE TABLE `t_user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主é®',
`user_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'ç¨æ·å',
`full_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'å
¨å',
`age` int(11) DEFAULT '18' COMMENT 'å¹´é¾',
`updated_date` date DEFAULT NULL COMMENT 'æ´æ°æ¥æ',
PRIMARY KEY (`id`),
KEY `combined_key` (`user_name`,`full_name`,`age`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
å¯ä»¥çå°å建äºä¸ä¸ªå å« 3 åå段ï¼user_nameãfull_nameãageï¼çç»åç´¢å¼ã
- 使ç¨ç»åç´¢å¼ä¸ï¼ç¬¬ä¸åè¿è¡äºæ¨¡ç³æ¥è¯¢
EXPLAIN SELECT * FROM `t_user` WHERE user_name like 'Shannon%' AND full_name = 'xiao ming' And age = 20;
å 为索å¼å¹é è§åæ¯ä»å·¦å°å³å¹é ï¼å½ä½¿ç¨ user_name è¿è¡æ¨¡ç³æ¥è¯¢æ¶ä¼å¯¼è´å³ä½¿æ£ç¡®ä½¿ç¨ç»åç´¢å¼ï¼åå¨å¼ææç»ä¹åªè½ç¨ä¸å ¶ä¸ç user_name è¿ä¸ä¸ªå段æ¥åçéï¼åé¢ä¸¤ä¸ªå段éè¦äº¤ç» Server å±èªè¡çé
使ç¨
æ¥æ¥çæ§è¡è®¡åï¼å¯ä»¥çå°EXPLAIN
åæ¯Extra
å¦ææç´¢å¼æ¡ä»¶ä¸æ¨å ³éçè¯ï¼å¯ä»¥çå°Using Index Condition
åæ¯Extra
Using Where
- 使ç¨äºç»åç´¢å¼ä¸ç第ä¸åå第ä¸å
EXPLAIN SELECT * FROM `t_user` WHERE user_name = 'Shannon Henry' AND age = 20;
æ ¹æ®æ左索å¼å¹é è§åï¼ä½¿ç¨ç»åç´¢å¼æ¶å¿ é¡»ä¸¥æ ¼æç §ç»åç´¢å¼ä¸å段ç顺åºæ¥ä½¿ç¨ï¼è¿ä¹ä½¿ç¨ä¼å¯¼è´åå¨å¼æå±åªè½ä½¿ç¨ user_name è¿ä¸ªæ¡ä»¶åçé
使ç¨
æ¥æ¥çæ§è¡è®¡åï¼å¯ä»¥çå°EXPLAIN
åæ¯Extra
å¦ææç´¢å¼æ¡ä»¶ä¸æ¨å ³éçè¯ï¼å¯ä»¥çå°Using Index Condition
åæ¯Extra
Using Where
ä»ä¸¤ä¸ªä¾åä¸æ们å¯ä»¥çå°ï¼è½ç¶ä½¿ç¨ç´¢å¼çæ¹å¼å¯¼è´ç»åç´¢å¼ä¸å¥æï¼ä½æ¯å¼å¯ç´¢å¼æ¡ä»¶ä¸æ¨ååå¨å¼æè¿æ¯è½æç´¢å¼æ¡ä»¶ç¨ä¸ï¼åå°è¿è¡å表ç次æ°ï¼ä»èè¾¾å°åå° IO 次æ°çç®çã
åèé¾æ¥ï¼äºåéææMySQLç´¢å¼ä¸æ¨