**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* - [æ°æ®åºçå®ä¹](#%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E5%AE%9A%E4%B9%89) - [MySQL çæ¶æ](#mysql-%E7%9A%84%E6%9E%B6%E6%9E%84) - [ç´¢å¼](#%E7%B4%A2%E5%BC%95) - [B+æ ç´¢å¼ååå¸ç´¢å¼çåºå«](#b%E6%A0%91%E7%B4%A2%E5%BC%95%E5%92%8C%E5%93%88%E5%B8%8C%E7%B4%A2%E5%BC%95%E7%9A%84%E5%8C%BA%E5%88%AB) - [Bæ åB+æ çåºå«](#b%E6%A0%91%E5%92%8Cb%E6%A0%91%E7%9A%84%E5%8C%BA%E5%88%AB) - [èéç´¢å¼åè¾ å©ç´¢å¼](#%E8%81%9A%E9%9B%86%E7%B4%A2%E5%BC%95%E5%92%8C%E8%BE%85%E5%8A%A9%E7%B4%A2%E5%BC%95) - [èéç´¢å¼](#%E8%81%9A%E9%9B%86%E7%B4%A2%E5%BC%95) - [è¾ å©ç´¢å¼](#%E8%BE%85%E5%8A%A9%E7%B4%A2%E5%BC%95) - [mysqlèåç´¢å¼](#mysql%E8%81%94%E5%90%88%E7%B4%A2%E5%BC%95) - [ä»ä¹æ åµä¸åºä¸å»ºæå°å»ºç´¢å¼](#%E4%BB%80%E4%B9%88%E6%83%85%E5%86%B5%E4%B8%8B%E5%BA%94%E4%B8%8D%E5%BB%BA%E6%88%96%E5%B0%91%E5%BB%BA%E7%B4%A2%E5%BC%95) - [导è´ç´¢å¼å¤±æçä¸äºæ åµ](#%E5%AF%BC%E8%87%B4%E7%B4%A2%E5%BC%95%E5%A4%B1%E6%95%88%E7%9A%84%E4%B8%80%E4%BA%9B%E6%83%85%E5%86%B5) - [keyåindexçåºå«](#key%E5%92%8Cindex%E7%9A%84%E5%8C%BA%E5%88%AB) - [é](#%E9%94%81) - [è¡é](#%E8%A1%8C%E9%94%81) - [ä¼ç¹](#%E4%BC%98%E7%82%B9) - [缺ç¹](#%E7%BC%BA%E7%82%B9) - [éçç®æ³](#%E9%94%81%E7%9A%84%E7%AE%97%E6%B3%95) - [Record Lock](#record-lock) - [Gap Lock](#gap-lock) - [Next-Key Lock](#next-key-lock) - [ééæ©](#%E9%94%81%E9%80%89%E6%8B%A9) - [MySQLååº](#mysql%E5%88%86%E5%8C%BA) - [ä»ä¹æ¯ååºï¼](#%E4%BB%80%E4%B9%88%E6%98%AF%E5%88%86%E5%8C%BA) - [ååºä¸å表çåºå«](#%E5%88%86%E5%8C%BA%E4%B8%8E%E5%88%86%E8%A1%A8%E7%9A%84%E5%8C%BA%E5%88%AB) - [使ç¨åºæ¯](#%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF) - [éå¶](#%E9%99%90%E5%88%B6) - [å¦ä½å¤æå½åMySQLæ¯å¦æ¯æååºï¼](#%E5%A6%82%E4%BD%95%E5%88%A4%E6%96%AD%E5%BD%93%E5%89%8Dmysql%E6%98%AF%E5%90%A6%E6%94%AF%E6%8C%81%E5%88%86%E5%8C%BA) - [MySQLæ¯æçååºç±»åæåªäºï¼](#mysql%E6%94%AF%E6%8C%81%E7%9A%84%E5%88%86%E5%8C%BA%E7%B1%BB%E5%9E%8B%E6%9C%89%E5%93%AA%E4%BA%9B) - [æ¥å¿æ¨¡å](#%E6%97%A5%E5%BF%97%E6%A8%A1%E5%9D%97) - [redo logï¼é忥å¿ï¼](#redo-log%E9%87%8D%E5%81%9A%E6%97%A5%E5%BF%97) - [binlogï¼å½æ¡£æ¥å¿ï¼](#binlog%E5%BD%92%E6%A1%A3%E6%97%A5%E5%BF%97) - [ä¸¤ç§æ¥å¿åºå«](#%E4%B8%A4%E7%A7%8D%E6%97%A5%E5%BF%97%E5%8C%BA%E5%88%AB) - [åç§é离级å«](#%E5%9B%9B%E7%A7%8D%E9%9A%94%E7%A6%BB%E7%BA%A7%E5%88%AB) - [对äºè读ï¼ä¸å¯éå¤è¯»ï¼å¹»è¯»ççè§£](#%E5%AF%B9%E4%BA%8E%E8%84%8F%E8%AF%BB%E4%B8%8D%E5%8F%AF%E9%87%8D%E5%A4%8D%E8%AF%BB%E5%B9%BB%E8%AF%BB%E7%9A%84%E7%90%86%E8%A7%A3) - [è读](#%E8%84%8F%E8%AF%BB) - [ä¸å¯éå¤è¯»](#%E4%B8%8D%E5%8F%AF%E9%87%8D%E5%A4%8D%E8%AF%BB) - [幻读](#%E5%B9%BB%E8%AF%BB) - [ä¸å¯éå¤è¯»å幻读åºå«](#%E4%B8%8D%E5%8F%AF%E9%87%8D%E5%A4%8D%E8%AF%BB%E5%92%8C%E5%B9%BB%E8%AF%BB%E5%8C%BA%E5%88%AB) - [å ³äºMVVC](#%E5%85%B3%E4%BA%8Emvvc) - [åå¨è¿ç¨](#%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B) - [Mysqlåå¨å¼æ](#mysql%E5%AD%98%E5%82%A8%E5%BC%95%E6%93%8E) - [MyISAMåInnoDBçåºå«](#myisam%E5%92%8Cinnodb%E7%9A%84%E5%8C%BA%E5%88%AB) - [å¦ä½éæ©](#%E5%A6%82%E4%BD%95%E9%80%89%E6%8B%A9) - [mysql主ä»åæ¥](#mysql%E4%B8%BB%E4%BB%8E%E5%90%8C%E6%AD%A5) - [使ç¨ä¸»ä»åæ¥ç好å¤](#%E4%BD%BF%E7%94%A8%E4%B8%BB%E4%BB%8E%E5%90%8C%E6%AD%A5%E7%9A%84%E5%A5%BD%E5%A4%84) - [主ä»å¤å¶åç](#%E4%B8%BB%E4%BB%8E%E5%A4%8D%E5%88%B6%E5%8E%9F%E7%90%86) - [MySQLäºå¡åç](#mysql%E4%BA%8B%E5%8A%A1%E5%8E%9F%E7%90%86) - [undo æ¥å¿æä»¶](#undo-%E6%97%A5%E5%BF%97%E6%96%87%E4%BB%B6) - [redo/undoæ¥å¿æä»¶](#redoundo%E6%97%A5%E5%BF%97%E6%96%87%E4%BB%B6) - [为ä»ä¹ç¨èªå¢åä½ä¸ºä¸»é®](#%E4%B8%BA%E4%BB%80%E4%B9%88%E7%94%A8%E8%87%AA%E5%A2%9E%E5%88%97%E4%BD%9C%E4%B8%BA%E4%B8%BB%E9%94%AE) - [Joinçå®ç°åç](#join%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86) - [ä¼å](#%E4%BC%98%E5%8C%96) - [MySQLä¼å](#mysql%E4%BC%98%E5%8C%96) # æ°æ®åºçå®ä¹ æ°æ®åºï¼ç©çæä½æä»¶ç³»ç»æå ¶ä»å½¢å¼æä»¶ç±»åçéåï¼ å®ä¾ï¼MySQL æ°æ®åºç±åå°çº¿ç¨ä»¥åä¸ä¸ªå ±äº«å ååºç»æï¼ å¨ MySQL ä¸ï¼å®ä¾åæ°æ®åºå¾å¾é½æ¯ä¸ä¸å¯¹åºçï¼èæä»¬ä¹æ æ³ç´æ¥æä½æ°æ®åºï¼èæ¯è¦éè¿æ°æ®åºå®ä¾æ¥æä½æ°æ®åºæä»¶ï¼å¯ä»¥çè§£ä¸ºæ°æ®åºå®ä¾æ¯æ°æ®åºä¸ºä¸å±æä¾çä¸ä¸ªä¸é¨ç¨äºæä½çæ¥å£ã å¨ Unix ä¸ï¼å¯å¨ä¸ä¸ª MySQL å®ä¾å¾å¾ä¼äº§ç两个è¿ç¨ï¼mysqld å°±æ¯çæ£çæ°æ®åºæå¡å®æ¤è¿ç¨ï¼è mysqld_safe æ¯ä¸ä¸ªç¨äºæ£æ¥å设置 mysqld å¯å¨çæ§å¶ç¨åºï¼å®è´è´£çæ§ MySQL è¿ç¨çæ§è¡ï¼å½ mysqld åçé误æ¶ï¼mysqld_safe ä¼å¯¹å ¶ç¶æè¿è¡æ£æ¥å¹¶å¨åéçæ¡ä»¶ä¸éå¯ã # MySQL çæ¶æ   # ç´¢å¼ ç´¢å¼æ¯æ°æ®åºä¸é常é常éè¦çæ¦å¿µï¼å®æ¯åå¨å¼æè½å¤å¿«éå®ä½è®°å½çç§å¯æ¦å¨ï¼å¯¹äºæåæ°æ®åºçæ§è½ãåè½»æ°æ®åºæå¡å¨çè´æ æçé常éè¦çä½ç¨ï¼ç´¢å¼ä¼åæ¯å¯¹æ¥è¯¢æ§è½ä¼åçæææææ®µï¼å®è½å¤è½»æ¾å°å°æ¥è¯¢çæ§è½æé«å 个æ°é级ã **为ä»ä¹ä½¿ç¨æ°æ®ç´¢å¼è½æé«æçï¼** 1. æ°æ®ç´¢å¼çå卿¯æåºç 2. 卿åºçæ åµä¸ï¼éè¿ç´¢å¼æ¥è¯¢ä¸ä¸ªæ°æ®æ¯æ ééåç´¢å¼è®°å½ç 3. æç«¯æ åµä¸ï¼æ°æ®ç´¢å¼çæ¥è¯¢æç为äºåæ³æ¥è¯¢æçï¼è¶è¿äº log2(N) ## B+æ ç´¢å¼ååå¸ç´¢å¼çåºå« B+æ æ¯ä¸ä¸ªå¹³è¡¡çå¤åæ ï¼ä»æ ¹èç¹å°æ¯ä¸ªå¶åèç¹çé«åº¦å·®å¼ä¸è¶ è¿1ï¼èä¸åå±çº§çèç¹é´ææéç¸äºé¾æ¥ï¼æ¯æåºç  åå¸ç´¢å¼å°±æ¯éç¨ä¸å®çåå¸ç®æ³ï¼æé®å¼æ¢ç®ææ°çåå¸å¼ï¼æ£ç´¢æ¶ä¸éè¦ç±»ä¼¼B+æ 飿 ·ä»æ ¹èç¹å°å¶åèç¹éçº§æ¥æ¾ï¼åªé䏿¬¡åå¸ç®æ³å³å¯,æ¯æ åºç  **åå¸ç´¢å¼çä¼å¿ï¼** 1. ç弿¥è¯¢ãåå¸ç´¢å¼å ·æç»å¯¹ä¼å¿ï¼åææ¯ï¼æ²¡æå¤§ééå¤é®å¼ï¼å¦æå¤§ééå¤é®å¼æ¶ï¼åå¸ç´¢å¼çæçå¾ä½ï¼å 为å卿è°çåå¸ç¢°æé®é¢ãï¼ **åå¸ç´¢å¼ä¸éç¨çåºæ¯ï¼** 1. 䏿¯æèå´æ¥è¯¢ 2. 䏿¯æç´¢å¼å®ææåº 3. 䏿¯æèåç´¢å¼çæå·¦åç¼å¹é è§å é常ï¼B+æ ç´¢å¼ç»æéç¨äºç»å¤§å¤æ°åºæ¯ï¼åä¸é¢è¿ç§åºæ¯ç¨åå¸ç´¢å¼ææ´æä¼å¿ï¼ å¨HEAP表ä¸ï¼å¦æåå¨çæ°æ®éå¤åº¦å¾ä½ï¼ä¹å°±æ¯è¯´åºæ°å¾å¤§ï¼ï¼å¯¹è¯¥åæ°æ®ä»¥ç弿¥è¯¢ä¸ºä¸»ï¼æ²¡æèå´æ¥è¯¢ã没ææåºçæ¶åï¼ç¹å«éåéç¨åå¸ç´¢å¼ï¼ä¾å¦è¿ç§SQLï¼ ```mysql select id,name from table where name='ææ'; â ä» ç弿¥è¯¢ ``` è常ç¨çInnoDB弿ä¸é»è®¤ä½¿ç¨çæ¯B+æ ç´¢å¼ï¼å®ä¼å®æ¶çæ§è¡¨ä¸ç´¢å¼çä½¿ç¨æ åµï¼å¦æè®¤ä¸ºå»ºç«åå¸ç´¢å¼å¯ä»¥æé«æ¥è¯¢æçï¼åèªå¨å¨å åä¸çâèªéåºåå¸ç´¢å¼ç¼å²åºâ建ç«åå¸ç´¢å¼ï¼å¨InnoDBä¸é»è®¤å¼å¯èªéåºåå¸ç´¢å¼ï¼ï¼éè¿è§å¯æç´¢æ¨¡å¼ï¼MySQLä¼å©ç¨index keyçåç¼å»ºç«åå¸ç´¢å¼ï¼å¦æä¸ä¸ªè¡¨å ä¹å¤§é¨åé½å¨ç¼å²æ± ä¸ï¼é£ä¹å»ºç«ä¸ä¸ªåå¸ç´¢å¼è½å¤å å¿«ç弿¥è¯¢ã 注æï¼å¨æäºå·¥ä½è´è½½ä¸ï¼éè¿åå¸ç´¢å¼æ¥æ¾å¸¦æ¥çæ§è½æåè¿å¤§äºé¢å¤ççæ§ç´¢å¼æç´¢æ åµåä¿æè¿ä¸ªåå¸è¡¨ç»ææå¸¦æ¥çå¼éãä½æäºæ¶åï¼å¨è´è½½é«çæ åµä¸ï¼èªéåºåå¸ç´¢å¼ä¸æ·»å çread/writeéä¹ä¼å¸¦æ¥ç«äºï¼æ¯å¦é«å¹¶åçjoinæä½ãlikeæä½å%çéé 符æä½ä¹ä¸éç¨äºèªéåºåå¸ç´¢å¼ï¼å¯è½è¦å ³éèªéåºåå¸ç´¢å¼ã ## Bæ åB+æ çåºå« 1. Bæ ï¼æ¯ä¸ªèç¹é½åå¨keyådataï¼ææèç¹ç»æè¿æ£µæ ï¼å¹¶ä¸å¶åèç¹æé为nulï¼å¶åç»ç¹ä¸å å«ä»»ä½å ³é®åä¿¡æ¯ã  2. B+æ ï¼ææçå¶åç»ç¹ä¸å å«äºå ¨é¨å ³é®åçä¿¡æ¯ï¼åæå嫿è¿äºå ³é®åè®°å½çæéï¼ä¸å¶åç»ç¹æ¬èº«ä¾å ³é®åç大å°èªå°è大ç顺åºé¾æ¥ï¼ææçéç»ç«¯ç»ç¹å¯ä»¥çææ¯ç´¢å¼é¨åï¼ç»ç¹ä¸ä» å«æå ¶åæ æ ¹ç»ç¹ä¸æå¤§ï¼ææå°ï¼å ³é®åã (èB æ çéç»èç¹ä¹å å«éè¦æ¥æ¾çææä¿¡æ¯)  **为ä»ä¹è¯´B+æ¯Bæ æ´éåå®é åºç¨ä¸æä½ç³»ç»çæä»¶ç´¢å¼åæ°æ®åºç´¢å¼ï¼** 1ã B+çç£ç读å代价æ´ä½ B+çå é¨ç»ç¹å¹¶æ²¡ææåå ³é®åå ·ä½ä¿¡æ¯çæéãå æ¤å ¶å é¨ç»ç¹ç¸å¯¹Bæ æ´å°ãå¦ææææåä¸å é¨ç»ç¹çå ³é®ååæ¾å¨åä¸çåä¸ï¼é£ä¹çåæè½å®¹çº³çå ³é®åæ°éä¹è¶å¤ã䏿¬¡æ§è¯»å ¥å åä¸çéè¦æ¥æ¾çå ³é®åä¹å°±è¶å¤ãç¸å¯¹æ¥è¯´IOè¯»åæ¬¡æ°ä¹å°±éä½äºã 2ã B+-treeçæ¥è¯¢æçæ´å ç¨³å® ç±äºéç»ç»ç¹å¹¶ä¸æ¯æç»æåæä»¶å 容çç»ç¹ï¼èåªæ¯å¶åç»ç¹ä¸å ³é®åçç´¢å¼ãæä»¥ä»»ä½å ³é®åçæ¥æ¾å¿ é¡»èµ°ä¸æ¡ä»æ ¹ç»ç¹å°å¶åç»ç¹çè·¯ãææå ³é®åæ¥è¯¢çè·¯å¾é¿åº¦ç¸åï¼å¯¼è´æ¯ä¸ä¸ªæ°æ®çæ¥è¯¢æçç¸å½ã ## èéç´¢å¼åè¾ å©ç´¢å¼ æ°æ®åºä¸ç B+ æ ç´¢å¼å¯ä»¥å为èéç´¢å¼ï¼clustered indexï¼åè¾ å©ç´¢å¼ï¼secondary indexï¼ï¼å®ä»¬ä¹é´çæå¤§åºå«å°±æ¯ï¼èéç´¢å¼ä¸åæ¾ç䏿¡è¡è®°å½çå ¨é¨ä¿¡æ¯ï¼èè¾ å©ç´¢å¼ä¸åªå å«ç´¢å¼ååä¸ä¸ªç¨äºæ¥æ¾å¯¹åºè¡è®°å½çã书ç¾ãã ### èéç´¢å¼ èéç´¢å¼ï¼æç´¢å¼é¡¹çæåºæ¹å¼åè¡¨ä¸æ°æ®è®°å½æåºæ¹å¼ä¸è´çç´¢å¼ï¼æ¯å¼ 表åªè½æä¸ä¸ªèéç´¢å¼ï¼èéç´¢å¼çå¶åèç¹åå¨äºæ´ä¸ªè¡æ°æ®ã è§£éï¼ä»ä¹å«ç´¢å¼é¡¹çæåºæ¹å¼åè¡¨ä¸æ°æ®è®°å½æåºæ¹å¼ä¸è´å¢ï¼ æä»¬æä¸æ¬åå ¸çåæ¯æ°æ®åºç表ï¼é£ä¹åå ¸çæ¼é³ç®å½å°±æ¯èéç´¢å¼ï¼å®æç §A-Zæåãå®é åå¨çå乿¯æA-Zæåçãè¿å°±æ¯ç´¢å¼é¡¹çæåºæ¹å¼åè¡¨ä¸æ°æ®è®°å½æåºæ¹å¼ä¸è´ã 对äºInnodbï¼ä¸»é®æ¯«æ ç鮿¯ä¸ä¸ªèéç´¢å¼ã使¯å½ä¸ä¸ªè¡¨æ²¡æä¸»é®ï¼æè 没æä¸ä¸ªç´¢å¼ï¼Innodbä¼å¦ä½å¤çå¢ã请çå¦ä¸è§å: 1. 妿ä¸ä¸ªä¸»é®è¢«å®ä¹äºï¼é£ä¹è¿ä¸ªä¸»é®å°±æ¯ä½ä¸ºèéç´¢å¼ã 2. å¦ææ²¡æä¸»é®è¢«å®ä¹ï¼é£ä¹è¯¥è¡¨ç第ä¸ä¸ªå¯ä¸é空索å¼è¢«ä½ä¸ºèéç´¢å¼ã 3. å¦ææ²¡æä¸»é®ä¹æ²¡æåéçå¯ä¸ç´¢å¼ï¼é£ä¹innodbå é¨ä¼çæä¸ä¸ªéèç主é®ä½ä¸ºèéç´¢å¼ï¼è¿ä¸ªéèç䏻鮿¯ä¸ä¸ª6个åèçåï¼è¯¥åçå¼ä¼éçæ°æ®çæå ¥èªå¢ã  ### è¾ å©ç´¢å¼ è¾ å©ç´¢å¼ï¼è¾ å©ç´¢å¼ä¸ç´¢å¼çé»è¾é¡ºåºä¸ç£çä¸è¡çç©çåå¨é¡ºåºä¸åï¼ä¸ä¸ªè¡¨ä¸å¯ä»¥æ¥æå¤ä¸ªéèéç´¢å¼ãå¶åèç¹å¹¶ä¸å å«è¡è®°å½çå ¨é¨æ°æ®ãå¶åèç¹é¤äºå å«é®å¼ä»¥å¤ï¼è¿åå¨äºä¸ä¸ªæåæ¹è¡æ°æ®çèéç´¢å¼å»ºç书ç¾ã è¾ å©ç´¢å¼å¯ä»¥çè§£æåå ¸æåæå»æ¥åã è¾ å©ç´¢å¼çåå¨å¹¶ä¸ä¼å½±åèéç´¢å¼ï¼å 为èéç´¢å¼ææç B+ æ æ¯æ°æ®å®é åå¨çå½¢å¼ï¼èè¾ å©ç´¢å¼åªç¨äºå éæ°æ®çæ¥æ¾ï¼æä»¥ä¸å¼ 表ä¸å¾å¾æå¤ä¸ªè¾ å©ç´¢å¼ä»¥æ¤æ¥æåæ°æ®åºçæ§è½ã ä¸å¼ 表ä¸å®å å«ä¸ä¸ªèéç´¢å¼ææç B+ æ 以åè¥å¹²è¾ å©ç´¢å¼çææç B+ æ ã éè¿è¾ å©ç´¢å¼æ¥æ¾å°å¯¹åºç主é®ï¼æåå¨èéç´¢å¼ä¸ä½¿ç¨ä¸»é®è·å对åºçè¡è®°å½ï¼è¿ä¹æ¯é常æ åµä¸è¡è®°å½çæ¥æ¾æ¹å¼ã  ## mysqlèåç´¢å¼ 1. èåç´¢å¼æ¯ä¸¤ä¸ªææ´å¤ä¸ªåä¸çç´¢å¼ã对äºèåç´¢å¼:Mysqlä»å·¦å°å³ç使ç¨ç´¢å¼ä¸çåæ®µï¼ä¸ä¸ªæ¥è¯¢å¯ä»¥åªä½¿ç¨ç´¢å¼ä¸çä¸é¨ä»½ï¼ä½åªè½æ¯æå·¦ä¾§é¨åãä¾å¦ç´¢å¼æ¯key index (a,b,c). å¯ä»¥æ¯æa ã a,b ã a,b,c 3ç§ç»åè¿è¡æ¥æ¾ï¼ä½ä¸æ¯æ b,cè¿è¡æ¥æ¾ .彿左侧忮µæ¯å¸¸éå¼ç¨æ¶ï¼ç´¢å¼å°±ååææã 2. å©ç¨ç´¢å¼ä¸çéå åï¼æ¨å¯ä»¥ç¼©å°æç´¢çèå´ï¼ä½ä½¿ç¨ä¸ä¸ªå ·æä¸¤åçç´¢å¼ ä¸åäºä½¿ç¨ä¸¤ä¸ªåç¬çç´¢å¼ãå¤åç´¢å¼çç»æä¸çµè¯ç°¿ç±»ä¼¼ï¼äººåç±å§ååææï¼çµè¯ç°¿é¦å æå§æ°å¯¹è¿è¡æåºï¼ç¶åæåå对æç¸åå§æ°ç人è¿è¡æåºã妿æ¨ç¥ éå§ï¼çµè¯ç°¿å°é常æç¨ï¼å¦ææ¨ç¥éå§ååï¼çµè¯ç°¿åæ´ä¸ºæç¨ï¼ä½å¦ææ¨åªç¥éåä¸å§ï¼çµè¯ç°¿å°æ²¡æç¨å¤ã ## ä»ä¹æ åµä¸åºä¸å»ºæå°å»ºç´¢å¼ 1. 表记å½å¤ªå° 2. ç»å¸¸æå ¥ãå é¤ãä¿®æ¹ç表 3. æ°æ®éå¤ä¸åå¸å¹³åçè¡¨åæ®µï¼åå¦ä¸ä¸ªè¡¨æ10ä¸è¡è®°å½ï¼æä¸ä¸ªå段AåªæTåF两ç§å¼ï¼ä¸æ¯ä¸ªå¼çå叿¦ç大约为50%ï¼é£ä¹å¯¹è¿ç§è¡¨Aåæ®µå»ºç´¢å¼ä¸è¬ä¸ä¼æé«æ°æ®åºçæ¥è¯¢é度ã 4. ç»å¸¸å䏻忮µä¸åæ¥è¯¢ä½ä¸»å段索å¼å¼æ¯è¾å¤çè¡¨åæ®µ ## 导è´ç´¢å¼å¤±æçä¸äºæ åµ 1ï¼éå¼è½¬æ¢å¯¼è´ç´¢å¼å¤±æ.è¿ä¸ç¹åºå½å¼èµ·éè§.乿¯å¼åä¸ç»å¸¸ä¼ç¯çé误. ç±äºè¡¨çåæ®µtu_mdnå®ä¹ä¸ºvarchar2(20),ä½å¨æ¥è¯¢æ¶æè¯¥å段ä½ä¸ºnumberç±»å以whereæ¡ä»¶ä¼ ç»Oracle,è¿æ ·ä¼å¯¼è´ç´¢å¼å¤±æ. é误çä¾åï¼select * from test where tu_mdn=13333333333; æ£ç¡®çä¾åï¼select * from test where tu_mdn='13333333333'; 2. 对索å¼åè¿è¡è¿ç®å¯¼è´ç´¢å¼å¤±æ,æææç对索å¼åè¿è¡è¿ç®å æ¬(+ï¼-ï¼*ï¼/ï¼! ç) é误çä¾åï¼select * from test where id-1=9; æ£ç¡®çä¾åï¼select * from test where id=10; 3. 以ä¸ä½¿ç¨ä¼ä½¿ç´¢å¼å¤±æï¼åºé¿å 使ç¨ï¼ a. ä½¿ç¨ <> ãnot in ãnot existã!= b. like "%_" ç¾åå·å¨åï¼å¯éç¨å¨å»ºç«ç´¢å¼æ¶ç¨reverse(columnName)è¿ç§æ¹æ³å¤çï¼ c. åç¬å¼ç¨å¤åç´¢å¼éé第ä¸ä½ç½®çç´¢å¼å.åºæ»æ¯ä½¿ç¨ç´¢å¼ç第ä¸ä¸ªåï¼å¦æç´¢å¼æ¯å»ºç«å¨å¤ä¸ªåä¸, åªæå¨å®ç第ä¸ä¸ªå被whereåå¥å¼ç¨æ¶ï¼ä¼å卿ä¼éæ©ä½¿ç¨è¯¥ç´¢å¼ã d. å符ååæ®µä¸ºæ°åæ¶å¨whereæ¡ä»¶é䏿·»å å¼å·. e. å½åééç¨çæ¯timesåéï¼è表çåæ®µéç¨çæ¯dateåéæ¶.æç¸åæ åµã 4. ä¸è¦å°ç©ºçåéå¼ç´æ¥ä¸æ¯è¾è¿ç®ç¬¦ï¼ç¬¦å·ï¼æ¯è¾ã 妿åéå¯è½ä¸ºç©ºï¼åºä½¿ç¨ IS NULL æ IS NOT NULL è¿è¡æ¯è¾ï¼æè ä½¿ç¨ ISNULL 彿°ã 5. ä¸è¦å¨ SQL 代ç ä¸ä½¿ç¨åå¼å·ã å 为å符常é使ç¨åå¼å·ãå¦ææ²¡æå¿ è¦éå®å¯¹è±¡åç§°ï¼å¯ä»¥ä½¿ç¨ï¼é ANSI SQL æ åï¼æ¬å·å°åç§°æ¬èµ·æ¥ã 6. å°ç´¢å¼æå¨è¡¨ç©ºé´åæ°æ®æå¨è¡¨ç©ºé´åå«è®¾äºä¸åçç£çchunkä¸ï¼æå©äºæé«ç´¢å¼æ¥è¯¢çæçã ## keyåindexçåºå« 1. key æ¯æ°æ®åºçç©çç»æï¼å®å å«ä¸¤å±æä¹åä½ç¨ï¼ä¸æ¯çº¦æï¼åéäºçº¦æåè§èæ°æ®åºçç»æå®æ´æ§ï¼ï¼äºæ¯ç´¢å¼ï¼è¾ 婿¥è¯¢ç¨çï¼ãå æ¬primary key, unique key, foreign key ç 2. indexæ¯æ°æ®åºçç©çç»æï¼å®åªæ¯è¾ 婿¥è¯¢çï¼å®å建æ¶ä¼å¨å¦å¤ç表空é´ï¼mysqlä¸çinnodb表空é´ï¼ä»¥ä¸ä¸ªç±»ä¼¼ç®å½çç»æåå¨ãç´¢å¼è¦åç±»çè¯ï¼å为åç¼ç´¢å¼ãå ¨ææ¬ç´¢å¼çï¼ # é éçç§ç±»ä¸è¬å为ä¹è§éåæ²è§é两ç§ï¼InnoDB åå¨å¼æä¸ä½¿ç¨çå°±æ¯æ²è§éï¼èæç §éçç²åº¦ååï¼ä¹å¯ä»¥åæè¡éå表é. ## è¡é ### ä¼ç¹ 1. å½å¨è®¸å¤çº¿ç¨ä¸è®¿é®ä¸åçè¡æ¶åªåå¨å°ééå®å²çªã 2. åæ»æ¶åªæå°éçæ´æ¹ 3. å¯ä»¥é¿æ¶é´éå®åä¸çè¡ã ### ç¼ºç¹ 1. æ¯é¡µçº§æè¡¨çº§éå®å ç¨æ´å¤çå åã 2. å½å¨è¡¨ç大é¨åä¸ä½¿ç¨æ¶ï¼æ¯é¡µçº§æè¡¨çº§éå®éåº¦æ ¢ï¼å ä¸ºä½ å¿ é¡»è·åæ´å¤çéã 3. å¦æä½ å¨å¤§é¨åæ°æ®ä¸ç»å¸¸è¿è¡GROUP BYæä½æè å¿ é¡»ç»å¸¸æ«ææ´ä¸ªè¡¨ï¼æ¯å ¶å®éå®ææ¾æ ¢å¾å¤ã 4. ç¨é«çº§å«éå®ï¼éè¿æ¯æä¸åçç±»åéå®ï¼ä½ ä¹å¯ä»¥å¾å®¹æå°è°èåºç¨ç¨åºï¼å ä¸ºå ¶éææ¬å°äºè¡çº§éå®ã ## éçç®æ³ ä¸ç§éçç®æ³ï¼Record LockãGap Lock å Next-Key Lock ### Record Lock è®°å½éï¼Record Lockï¼æ¯å å°ç´¢å¼è®°å½ä¸çéï¼å设æä»¬åå¨ä¸é¢çä¸å¼ 表 usersï¼ ```java CREATE TABLE users( id INT NOT NULL AUTO_INCREMENT, last_name VARCHAR(255) NOT NULL, first_name VARCHAR(255), age INT, PRIMARY KEY(id), KEY(last_name), KEY(age) ); ``` 妿æä»¬ä½¿ç¨ id æè last_name ä½ä¸º SQL ä¸ WHERE è¯å¥çè¿æ»¤æ¡ä»¶ï¼é£ä¹ InnoDB å°±å¯ä»¥éè¿ç´¢å¼å»ºç«ç B+ æ æ¾å°è¡è®°å½å¹¶æ·»å ç´¢å¼ï¼ä½æ¯å¦æä½¿ç¨ first_name ä½ä¸ºè¿æ»¤æ¡ä»¶æ¶ï¼ç±äº InnoDB ä¸ç¥éå¾ ä¿®æ¹çè®°å½å ·ä½åæ¾çä½ç½®ï¼ä¹æ æ³å¯¹å°è¦ä¿®æ¹åªæ¡è®°å½æåååºå¤æå°±ä¼é宿´ä¸ªè¡¨ã ### Gap Lock è®°å½éæ¯å¨åå¨å¼æä¸æä¸ºå¸¸è§çéï¼é¤äºè®°å½éä¹å¤ï¼InnoDB ä¸è¿åå¨é´ééï¼Gap Lockï¼ï¼é´ééæ¯å¯¹ç´¢å¼è®°å½ä¸ç䏿®µè¿ç»åºåçéï¼å½ä½¿ç¨ç±»ä¼¼ SELECT * FROM users WHERE id BETWEEN 10 AND 20 FOR UPDATE; ç SQL è¯å¥æ¶ï¼å°±ä¼é»æ¢å ¶ä»äºå¡åè¡¨ä¸æå ¥ id = 15 çè®°å½ï¼å 为æ´ä¸ªèå´é½è¢«é´éééå®äºã é´é鿝åå¨å¼æå¯¹äºæ§è½åå¹¶åååºçæè¡¡ï¼å¹¶ä¸åªç¨äºæäºäºå¡é离级å«ã è½ç¶é´ééä¸ä¹åä¸ºå ±äº«éåäºæ¥éï¼ä¸è¿å®ä»¬ä¹é´å¹¶ä¸æ¯äºæ¥çï¼ä¹å°±æ¯ä¸åçäºå¡å¯ä»¥åæ¶ææä¸æ®µç¸åèå´çå ±äº«éåäºæ¥éï¼å®å¯ä¸é»æ¢çå°±æ¯å ¶ä»äºå¡åè¿ä¸ªèå´ä¸æ·»å æ°çè®°å½ã Gap Lockçä½ç¨æ¯ä¸ºäºé»æ¢å¤ä¸ªäºå¡å°è®°å½æå ¥å°åä¸ä¸ªèå´å ï¼è¿æ ·ä¼å¯¼è´å¹»è¯»ç产çãç¨æ·å¯ä»¥éè¿ä»¥ä¸ä¸¤ç§æå¡æ¾å¼å°å ³éGap Lockã 1. å°äºå¡çé离级å«è®¾ç½®ä¸ºREAD COMMITTED 2. å°åæ°innodb_locks_unsafe_for_binlog设置为1 é¤äºå¤é®çº¦æåå¯ä¸æ§æ£æ¥éè¦çGap Lockï¼å ¶ä½æ åµä» 使ç¨Record Lockè¿è¡éå®ãè¿æ ·åç ´åäºäºå¡çé离æ§ï¼å¹¶ä¸å¯¹äºreplicationä¼å¯¼è´ä¸»å¨æ°æ®çä¸ä¸è´ã ### Next-Key Lock Next-Key Lockæ¯ç»åäºGap LockåRecord Lockçä¸ç§éå®ç®æ³,å ¶è®¾ç½®çç®çæ¯ä¸ºäºè§£å³å¹»è¯»é®é¢ã 彿¥è¯¢çç´¢å¼å«æå¯ä¸å±æ§çæ¶åï¼InnoDBåå¨å¼æä¼å¯¹Next-Key Lockè¿è¡ä¼åï¼å°å ¶é为Record Lockï¼å³ä» ä» éä½ç´¢å¼æ¬èº«ï¼è䏿¯èå´ï¼ä»èæé«å¹¶åæçã 对äºå¯ä¸å¼çéå®ï¼Next-Key Locké级为Record Lockä» åå¨äºæ¥è¯¢ææçå¯ä¸ç´¢å¼åãè¥å¯ä¸ç´¢å¼ç±å¤ä¸ªåç»æï¼èæ¥è¯¢ä» æ¯æ¥æ¾å¤ä¸ªå¯ä¸ç´¢å¼åä¸çå ¶ä¸ä¸ä¸ªï¼é£ä¹æ¥è¯¢å ¶å®æ¯rangeç±»åï¼è䏿¯pointç±»åçæ¥è¯¢ãæ¤æ¶InnoDBåå¨å¼æä¾ç¶ä½¿ç¨Next-Key Lockè¿è¡éå®ã ## ééæ© ä¸é¢æä»¬é对大é¨åçSQLç±»ååææ¯å¦ä½å éçï¼å设äºå¡é离级å«ä¸ºå¯éå¤è¯» **select .. from**  ä¸å ä»»ä½ç±»åçé **select...from lock in share mode** 卿«æå°çä»»ä½ç´¢å¼è®°å½ä¸å å ±äº«çï¼sharedï¼next-key lockï¼è¿æä¸»é®èéç´¢å¼å æå®é **select..from for update** 卿«æå°çä»»ä½ç´¢å¼è®°å½ä¸å æå®çnext-key lockï¼è¿æä¸»é®èéç´¢å¼å æå®é **update..where  delete from..where** 卿«æå°çä»»ä½ç´¢å¼è®°å½ä¸å next-key lockï¼è¿æä¸»é®èéç´¢å¼å æå®é **insert into..** ç®åçinsertä¼å¨insertçè¡å¯¹åºçç´¢å¼è®°å½ä¸å ä¸ä¸ªæå®éï¼è¿æ¯ä¸ä¸ªrecord lockï¼å¹¶æ²¡ægapï¼æä»¥å¹¶ä¸ä¼é»å¡å ¶ä»sessionå¨gapé´ééæå ¥è®°å½ãä¸è¿å¨insertæä½ä¹åï¼è¿ä¼å ä¸ç§éï¼å®æ¹ææ¡£ç§°å®ä¸ºinsertion intention gap lockï¼ä¹å°±æ¯æåçgapéãè¿ä¸ªæågapéçä½ç¨å°±æ¯é¢ç¤ºçå½å¤äºå¡å¹¶åæå ¥ç¸åçgapç©ºéæ¶ï¼åªè¦æå ¥çè®°å½ä¸æ¯gapé´éä¸çç¸åä½ç½®ï¼åæ éçå¾ å ¶ä»sessionå°±å¯å®æï¼è¿æ ·å°±ä½¿å¾insertæä½æ é¡»å çæ£çgap lockãæ³è±¡ä¸ä¸ï¼å¦æä¸ä¸ªè¡¨æä¸ä¸ªç´¢å¼idx_testï¼è¡¨ä¸æè®°å½1å8ï¼é£ä¹æ¯ä¸ªäºå¡é½å¯ä»¥å¨2å7ä¹é´æå ¥ä»»ä½è®°å½ï¼åªä¼å¯¹å½åæå ¥çè®°å½å record lockï¼å¹¶ä¸ä¼é»å¡å ¶ä»sessionæå ¥ä¸èªå·±ä¸åçè®°å½ï¼å 为ä»ä»¬å¹¶æ²¡æä»»ä½å²çªã # MySQLååº ## ä»ä¹æ¯ååºï¼ 表ååºï¼æ¯ææ ¹æ®ä¸å®è§åï¼å°æ°æ®åºä¸çä¸å¼ 表åè§£æå¤ä¸ªæ´å°çï¼å®¹æç®¡ççé¨åãä»é»è¾ä¸çï¼åªæä¸å¼ 表ï¼ä½æ¯åºå±å´æ¯ç±å¤ä¸ªç©çååºç»æã ## ååºä¸å表çåºå« åè¡¨ï¼æçæ¯éè¿ä¸å®è§åï¼å°ä¸å¼ 表åè§£æå¤å¼ ä¸åçè¡¨ãæ¯å¦å°ç¨æ·è®¢åè®°å½æ ¹æ®æ¶é´æå¤ä¸ªè¡¨ã å表ä¸ååºçåºå«å¨äºï¼ååºä»é»è¾ä¸æ¥è®²åªæä¸å¼ 表ï¼èåè¡¨åæ¯å°ä¸å¼ 表åè§£æå¤å¼ 表ã ## 使ç¨åºæ¯ 1. 表éå¸¸å¤§ï¼æ æ³å ¨é¨åå¨å åï¼æè åªå¨è¡¨çæåæçç¹æ°æ®ï¼å ¶ä»é½æ¯å岿°æ®ã 2. ååºè¡¨çæ°æ®æ´æç»´æ¤ï¼å¯ä»¥å¯¹ç¬ç«çååºè¿è¡ç¬ç«çæä½ã 3. ååºè¡¨çæ°æ®å¯ä»¥åå¸å¨ä¸åçæºå¨ä¸ï¼ä»è髿éç¨èµæºã 4. å¯ä»¥ä½¿ç¨ååºè¡¨æ¥é¿å æäºç¹æ®çç¶é¢ 5. å¯ä»¥å¤ä»½åæ¢å¤ç¬ç«çååº ## éå¶ 1. ä¸ä¸ªè¡¨æå¤åªè½æ1024个ååº 2. MySQL5.1ä¸ï¼ååºè¡¨è¾¾å¼å¿ é¡»æ¯æ´æ°ï¼æè è¿åæ´æ°ç表达å¼ãå¨MySQL5.5䏿ä¾äºéæ´æ°è¡¨è¾¾å¼ååºçæ¯æã 3. 妿ååºåæ®µä¸æä¸»é®æè å¯ä¸ç´¢å¼çåï¼é£ä¹å¤æä¸»é®ååå¯ä¸ç´¢å¼åé½å¿ é¡»å å«è¿æ¥ãå³ï¼ååºå段è¦ä¹ä¸å å«ä¸»é®æè ç´¢å¼åï¼è¦ä¹å å«å ¨é¨ä¸»é®åç´¢å¼åã 4. ååºè¡¨ä¸æ æ³ä½¿ç¨å¤é®çº¦æ 5. éè¦å¯¹ç°æè¡¨çç»æè¿è¡ä¿®æ¹ 6. ææååºé½å¿ 须使ç¨ç¸åçåå¨å¼æ 7. ååºå½æ°ä¸å¯ä»¥ä½¿ç¨ç彿°å表达å¼ä¼æä¸äºéå¶ 8. æäºåå¨å¼æä¸æ¯æååº 9. 对äºMyISAMçååºè¡¨ï¼ä¸è½ä½¿ç¨load index into cache 10. 对äºMyISAM表ï¼ä½¿ç¨ååºè¡¨æ¶éè¦æå¼æ´å¤çæä»¶æè¿°ç¬¦ ## å¦ä½å¤æå½åMySQLæ¯å¦æ¯æååºï¼ å½ä»¤ï¼show variables like '%partition%' è¿è¡ç»æ: mysql> show variables like '%partition%'; ```mysql +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | have_partitioning | YES | +-------------------+-------+ ``` 1 row in set (0.00 sec) have_partintioning çå¼ä¸ºYESï¼è¡¨ç¤ºæ¯æååºã ## MySQLæ¯æçååºç±»åæåªäºï¼ 1. RANGEååºï¼ è¿ç§æ¨¡å¼å è®¸å°æ°æ®ååä¸åèå´ãä¾å¦å¯ä»¥å°ä¸ä¸ªè¡¨éè¿å¹´ä»½ååæè¥å¹²ä¸ªååº 2. LISTååºï¼ è¿ç§æ¨¡å¼å 许系ç»éè¿é¢å®ä¹çå表ç弿¥å¯¹æ°æ®è¿è¡åå²ãæç §Listä¸çå¼ååºï¼ä¸RANGEçåºå«æ¯ï¼rangeååºçåºé´èå´å¼æ¯è¿ç»çã 3. HASHååº ï¼è¿ä¸æ¨¡å¼å 许éè¿å¯¹è¡¨çä¸ä¸ªæå¤ä¸ªåçHash Keyè¿è¡è®¡ç®ï¼æåéè¿è¿ä¸ªHashç ä¸åæ°å¼å¯¹åºçæ°æ®åºåè¿è¡ååºãä¾å¦å¯ä»¥å»ºç«ä¸ä¸ªå¯¹è¡¨ä¸»é®è¿è¡ååºç表ã 4. KEYååº ï¼ä¸é¢Hash模å¼çä¸ç§å»¶ä¼¸ï¼è¿éçHash Keyæ¯MySQLç³»ç»äº§ççã # æ¥å¿æ¨¡å ## redo logï¼é忥å¿ï¼ 妿æ¯ä¸æ¬¡çæ´æ°æä½é½éè¦åè¿ç£çï¼ç¶åç£çä¹è¦æ¾å°å¯¹åºç飿¡è®°å½ï¼ç¶ååæ´æ°ï¼æ´ä¸ªè¿ç¨ IO ææ¬ãæ¥æ¾ææ¬é½å¾é«ã为äºè§£å³è¿ä¸ªé®é¢ï¼å¯ä»¥ä½¿ç¨ WAL ææ¯ï¼WAL çå ¨ç§°æ¯ Write-Ahead Loggingï¼å®çå ³é®ç¹å°±æ¯å 忥å¿ï¼ååç£ç å ·ä½æ¥è¯´ï¼å½æä¸æ¡è®°å½éè¦æ´æ°çæ¶åï¼InnoDB 弿就ä¼å æè®°å½åå° redo logéé¢ï¼å¹¶æ´æ°å åï¼è¿ä¸ªæ¶åæ´æ°å°±ç®å®æäºãåæ¶ï¼InnoDB 弿ä¼å¨éå½çæ¶åï¼å°è¿ä¸ªæä½è®°å½æ´æ°å°ç£çéé¢ï¼èè¿ä¸ªæ´æ°å¾å¾æ¯å¨ç³»ç»æ¯è¾ç©ºé²çæ¶ååã InnoDB ç redo log æ¯åºå®å¤§å°çï¼æ¯å¦å¯ä»¥é 置为ä¸ç» 4 个æä»¶ï¼æ¯ä¸ªæä»¶ç大尿¯ 1GBï¼ä¹å°±æ¯æ»å ±å°±å¯ä»¥è®°å½ 4GB çæä½ãä»å¤´å¼å§åï¼åå°æ«å°¾å°±ååå°å¼å¤´å¾ªç¯åã ## binlogï¼å½æ¡£æ¥å¿ï¼ MySQL æ´ä½æ¥çï¼å ¶å®å°±æä¸¤åï¼ä¸åæ¯ Server å±ï¼å®ä¸»è¦åçæ¯ MySQL åè½å±é¢çäºæ ï¼è¿æä¸åæ¯å¼æå±ï¼è´è´£åå¨ç¸å ³çå ·ä½äºå®ã redo log æ¯ InnoDB å¼æç¹æçæ¥å¿ï¼è Server å±ä¹æèªå·±çæ¥å¿ï¼ç§°ä¸º binlogï¼å½æ¡£æ¥å¿ï¼ ä½ç¨ï¼ 1. å¯ä»¥ç¨æ¥æ¥çæ°æ®åºçåæ´åå²ï¼å ·ä½çæ¶é´ç¹ææçSQLæä½ï¼ 2. æ°æ®åºå¢éå¤ä»½åæ¢å¤ï¼å¢éå¤ä»½ååºäºæ¶é´ç¹çæ¢å¤ï¼ 3. MySQLçå¤å¶ï¼ä¸»ä¸»æ°æ®åºçå¤å¶ã䏻仿°æ®åºçå¤å¶ï¼ ## ä¸¤ç§æ¥å¿åºå« 1. redo log æ¯ InnoDB å¼æç¹æçï¼binlog æ¯ MySQL ç Server å±å®ç°çï¼ææå¼æé½å¯ä»¥ä½¿ç¨ã 2. redo log æ¯ç©çæ¥å¿ï¼è®°å½çæ¯âå¨æä¸ªæ°æ®é¡µä¸åäºä»ä¹ä¿®æ¹âï¼binlog æ¯é»è¾æ¥å¿ï¼è®°å½çæ¯è¿ä¸ªè¯å¥çåå§é»è¾ï¼æ¯å¦âç» ID=2 è¿ä¸è¡ç c åæ®µå 1 âã 3. redo log æ¯å¾ªç¯åçï¼ç©ºé´åºå®ä¼ç¨å®ï¼binlog æ¯å¯ä»¥è¿½å åå ¥çãâ追å åâæ¯æ binlog æä»¶åå°ä¸å®å¤§å°åä¼åæ¢å°ä¸ä¸ä¸ªï¼å¹¶ä¸ä¼è¦ç以åçæ¥å¿ã # åç§éç¦»çº§å« 1. Serializable (串è¡å)ï¼å¯é¿å è读ãä¸å¯éå¤è¯»ã幻读çåçã 2. Repeatable read (å¯éå¤è¯»)ï¼å¯é¿å è读ãä¸å¯éå¤è¯»çåçã 3. Read committed (读已æäº¤)ï¼å¯é¿å è读çåçã 4. Read uncommitted (è¯»æªæäº¤)ï¼æä½çº§å«ï¼ä»»ä½æ åµé½æ æ³ä¿è¯ã # 对äºè读ï¼ä¸å¯éå¤è¯»ï¼å¹»è¯»ççè§£ ## è读 éå¯¹æªæäº¤æ°æ® 妿ä¸ä¸ªäºå¡ä¸å¯¹æ°æ®è¿è¡äºæ´æ°ï¼ä½äºå¡è¿æ²¡ææäº¤ï¼å¦ä¸ä¸ªäºå¡å¯ä»¥âçå°â该äºå¡æ²¡ææäº¤çæ´æ°ç»æï¼è¿æ ·é æçé®é¢å°±æ¯ï¼å¦æç¬¬ä¸ä¸ªäºå¡åæ»ï¼é£ä¹ï¼ç¬¬äºä¸ªäºå¡å¨æ¤ä¹åæâçå°âçæ°æ®å°±æ¯ä¸ç¬èæ°æ®ã ## ä¸å¯éå¤è¯» éå¯¹å ¶ä»æäº¤ååï¼è¯»åæ°æ®æ¬èº«çå¯¹æ¯ ä¸å¯éå¤è¯»åæ¯æåä¸ä¸ªäºå¡å¨æ´ä¸ªäºå¡è¿ç¨ä¸å¯¹åä¸ç¬æ°æ®è¿è¡è¯»åï¼æ¯æ¬¡è¯»åç»æé½ä¸åã妿äºå¡1å¨äºå¡2çæ´æ°æä½ä¹å读å䏿¬¡æ°æ®ï¼å¨äºå¡2çæ´æ°æä½ä¹åå读ååä¸ç¬æ°æ®ä¸æ¬¡ï¼ä¸¤æ¬¡ç»ææ¯ä¸åçï¼æä»¥ï¼Read Uncommitted乿 æ³é¿å ä¸å¯éå¤è¯»åçé®é¢ã ## 幻读 éå¯¹å ¶ä»æäº¤ååï¼è¯»åæ°æ®æ¡æ°çå¯¹æ¯ å¹»è¯»æ¯æåæ ·ä¸ç¬æ¥è¯¢å¨æ´ä¸ªäºå¡è¿ç¨ä¸å¤æ¬¡æ§è¡åï¼æ¥è¯¢æå¾çç»æéæ¯ä¸ä¸æ ·çã幻读éå¯¹çæ¯å¤ç¬è®°å½ãå¨Read Uncommittedé离级å«ä¸ï¼ ä¸ç®¡äºå¡2çæå ¥æä½æ¯å¦æäº¤ï¼äºå¡1å¨æå ¥æä½ä¹ååä¹åæ§è¡ç¸åçæ¥è¯¢ï¼åå¾çç»æéæ¯ä¸åçï¼æä»¥ï¼Read Uncommittedåæ ·æ æ³é¿å 幻读çé®é¢ã ## ä¸å¯éå¤è¯»å幻读åºå« 1. ä¸å¯éå¤è¯»çéç¹æ¯ä¿®æ¹: åæ ·çæ¡ä»¶, ä½ è¯»åè¿çæ°æ®, 忬¡è¯»ååºæ¥åç°å¼ä¸ä¸æ ·äº 2. 幻读çéç¹å¨äºæ°å¢æè å é¤ (æ°æ®æ¡æ°åå)ï¼åæ ·çæ¡ä»¶ï¼ ç¬¬1次å第2æ¬¡è¯»åºæ¥çè®°å½æ°ä¸ä¸æ · # å ³äºMVVC MySQL InnoDBåå¨å¼æï¼å®ç°çæ¯åºäºå¤çæ¬çå¹¶åæ§å¶åè®®ââMVCC (Multi-Version Concurrency Control) (注ï¼ä¸MVCCç¸å¯¹çï¼æ¯åºäºéçå¹¶åæ§å¶ï¼Lock-Based Concurrency Control)ãMVCCæå¤§ç好å¤ï¼è¯»ä¸å éï¼è¯»åä¸å²çªãå¨è¯»å¤åå°çOLTPåºç¨ä¸ï¼è¯»åä¸å²çªæ¯é常éè¦çï¼æå¤§çå¢å äºç³»ç»çå¹¶åæ§è½ï¼ç°é¶æ®µå 乿æçRDBMSï¼é½æ¯æäºMVCCã 1. LBCCï¼Lock-Based Concurrency Controlï¼åºäºéçå¹¶åæ§å¶ã 2. MVCCï¼Multi-Version Concurrency Controlï¼åºäºå¤çæ¬çå¹¶åæ§å¶åè®®ã纯粹åºäºéçå¹¶åæºå¶å¹¶åéä½ï¼MVCCæ¯å¨åºäºéçå¹¶åæ§å¶ä¸çæ¹è¿ï¼ä¸»è¦æ¯å¨è¯»æä½ä¸æé«äºå¹¶åéã å¨MVCCå¹¶åæ§å¶ä¸ï¼è¯»æä½å¯ä»¥åæä¸¤ç±»ï¼ 1. å¿«ç §è¯» (snapshot read)ï¼è¯»åçæ¯è®°å½çå¯è§çæ¬ (æå¯è½æ¯åå²çæ¬)ï¼ä¸ç¨å éï¼å ±äº«è¯»éséä¹ä¸å ï¼æä»¥ä¸ä¼é»å¡å ¶ä»äºå¡çåï¼ã 2. å½å读 (current read)ï¼è¯»åçæ¯è®°å½çææ°çæ¬ï¼å¹¶ä¸ï¼å½å读è¿åçè®°å½ï¼é½ä¼å ä¸éï¼ä¿è¯å ¶ä»äºå¡ä¸ä¼åå¹¶åä¿®æ¹è¿æ¡è®°å½ã # åå¨è¿ç¨ ç®åç说ï¼å°±æ¯ä¸ç»SQLè¯å¥éï¼åè½å¼ºå¤§ï¼å¯ä»¥å®ç°ä¸äºæ¯è¾å¤æçé»è¾åè½ï¼ç±»ä¼¼äºJAVAè¯è¨ä¸çæ¹æ³ï¼ ps:åå¨è¿ç¨è·è§¦å卿ç¹ç±»ä¼¼ï¼é½æ¯ä¸ç»SQLéï¼ä½æ¯åå¨è¿ç¨æ¯ä¸»å¨è°ç¨çï¼ä¸åè½æ¯è§¦å卿´å 强大ï¼è§¦å卿¯æä»¶äºè§¦ååèªå¨è°ç¨ï¼ æåªäºç¹æ§ 1. æè¾å ¥è¾åºåæ°ï¼å¯ä»¥å£°æåéï¼æif/else, case,whileçæ§å¶è¯å¥ï¼éè¿ç¼ååå¨è¿ç¨ï¼å¯ä»¥å®ç°å¤æçé»è¾åè½ï¼ 2. 彿°çæ®éç¹æ§ï¼æ¨¡ååï¼å°è£ ï¼ä»£ç å¤ç¨ï¼ 3. é度快ï¼åªæé¦æ¬¡æ§è¡éç»è¿ç¼è¯åä¼åæ¥éª¤ï¼åç»è¢«è°ç¨å¯ä»¥ç´æ¥æ§è¡ï¼çå»ä»¥ä¸æ¥éª¤ï¼ # Mysqlåå¨å¼æ ## MyISAMåInnoDBçåºå« 1. InnoDBæ¯æäºå¡ï¼MyISAM䏿¯æï¼å¯¹äºInnoDBæ¯ä¸æ¡SQLè¯è¨é½é»è®¤å°è£ æäºå¡ï¼èªå¨æäº¤ï¼è¿æ ·ä¼å½±åéåº¦ï¼æä»¥æå¥½æå¤æ¡SQLè¯è¨æ¾å¨beginåcommitä¹é´ï¼ç»æä¸ä¸ªäºå¡ï¼ 2. InnoDBæ¯æå¤é®ï¼èMyISAM䏿¯æã对ä¸ä¸ªå å«å¤é®çInnoDB表转为MYISAMä¼å¤±è´¥ï¼ 3. InnoDBæ¯èéç´¢å¼ï¼æ°æ®æä»¶æ¯åç´¢å¼ç»å¨ä¸èµ·çï¼å¿ é¡»è¦æä¸»é®ï¼éè¿ä¸»é®ç´¢å¼æçå¾é«ã使¯è¾ å©ç´¢å¼éè¦ä¸¤æ¬¡æ¥è¯¢ï¼å æ¥è¯¢å°ä¸»é®ï¼ç¶ååéè¿ä¸»é®æ¥è¯¢å°æ°æ®ãå æ¤ï¼ä¸»é®ä¸åºè¯¥è¿å¤§ï¼å 为主é®å¤ªå¤§ï¼å ¶ä»ç´¢å¼ä¹é½ä¼å¾å¤§ãèMyISAMæ¯éèéç´¢å¼ï¼æ°æ®æä»¶æ¯å离çï¼ç´¢å¼ä¿åçæ¯æ°æ®æä»¶çæéã主é®ç´¢å¼åè¾ å©ç´¢å¼æ¯ç¬ç«çã 4. InnoDBä¸ä¿å表çå ·ä½è¡æ°ï¼æ§è¡select count(*) from tableæ¶éè¦å ¨è¡¨æ«æãèMyISAMç¨ä¸ä¸ªåéä¿åäºæ´ä¸ªè¡¨çè¡æ°ï¼æ§è¡ä¸è¿°è¯å¥æ¶åªéè¦è¯»åºè¯¥åéå³å¯ï¼é度å¾å¿«ï¼ 5. Innodb䏿¯æå ¨æç´¢å¼ï¼èMyISAMæ¯æå ¨æç´¢å¼ï¼æ¥è¯¢æçä¸MyISAMè¦é«ï¼ ## å¦ä½éæ© 1. æ¯å¦è¦æ¯æäºå¡ï¼å¦æè¦è¯·éæ©innodbï¼å¦æä¸éè¦å¯ä»¥èèMyISAMï¼ 2. å¦æè¡¨ä¸ç»å¤§å¤æ°é½åªæ¯è¯»æ¥è¯¢ï¼å¯ä»¥èèMyISAMï¼å¦ææ¢æè¯»å乿ºé¢ç¹ï¼è¯·ä½¿ç¨InnoDBã 3. ç³»ç»å¥æºåï¼MyISAMæ¢å¤èµ·æ¥æ´å°é¾ï¼è½å¦æ¥åï¼ 4. MySQL5.5çæ¬å¼å§Innodbå·²ç»æä¸ºMysqlçé»è®¤å¼æ(ä¹åæ¯MyISAM)ï¼è¯´æå ¶ä¼å¿æ¯æç®å ±ç¹çï¼å¦æä½ ä¸ç¥éç¨ä»ä¹ï¼é£å°±ç¨InnoDBï¼è³å°ä¸ä¼å·®ã # mysql主ä»åæ¥ ä¸»ä»åæ¥ä½¿å¾æ°æ®å¯ä»¥ä»ä¸ä¸ªæ°æ®åºæå¡å¨å¤å¶å°å ¶ä»æå¡å¨ä¸ï¼å¨å¤å¶æ°æ®æ¶ï¼ä¸ä¸ªæå¡å¨å å½ä¸»æå¡å¨ï¼masterï¼ï¼å ¶ä½çæå¡å¨å å½ä»æå¡å¨ï¼slaveï¼ãå 为å¤å¶æ¯å¼æ¥è¿è¡çï¼æä»¥ä»æå¡å¨ä¸éè¦ä¸ç´è¿æ¥ç主æå¡å¨ï¼ä»æå¡å¨çè³å¯ä»¥éè¿æ¨å·ææç»ç»å°è¿æ¥ä¸»æå¡å¨ãéè¿é ç½®æä»¶ï¼å¯ä»¥æå®å¤å¶ææçæ°æ®åºï¼æä¸ªæ°æ®åºï¼çè³æ¯æä¸ªæ°æ®åºä¸çæä¸ªè¡¨ã ## 使ç¨ä¸»ä»åæ¥çå¥½å¤ 1. éè¿å¢å 仿å¡å¨æ¥æé«æ°æ®åºçæ§è½ï¼å¨ä¸»æå¡å¨ä¸æ§è¡åå ¥åæ´æ°ï¼å¨ä»æå¡å¨ä¸å夿ä¾è¯»åè½ï¼å¯ä»¥å¨æå°è°æ´ä»æå¡å¨çæ°éï¼ä»èè°æ´æ´ä¸ªæ°æ®åºçæ§è½ã 2. æé«æ°æ®å®å ¨-å ä¸ºæ°æ®å·²å¤å¶å°ä»æå¡å¨ï¼ä»æå¡å¨å¯ä»¥ç»æ¢å¤å¶è¿ç¨ï¼æä»¥ï¼å¯ä»¥å¨ä»æå¡å¨ä¸å¤ä»½èä¸ç ´å主æå¡å¨ç¸åºæ°æ® 3. å¨ä¸»æå¡å¨ä¸çæå®æ¶æ°æ®ï¼èå¨ä»æå¡å¨ä¸åæè¿äºæ°æ®ï¼ä»èæé«ä¸»æå¡å¨çæ§è½ ## 主ä»å¤å¶åç >1. 主åºéè¦ä¸ä¸ªçº¿ç¨å«åI/Oçº¿ç¨ >2. ä»åºéè¦ä¸¤ä¸ªçº¿ç¨å®æï¼ä¸ä¸ªå«åI/O线ç¨ï¼ä¸ä¸ªå«åsqlçº¿ç¨  1. 主åºå¿ é¡»è¦å¼å¯binlogæ¥å¿æè½å®æä¸»ä»åæ¥ï¼å½ç¨æ·è¯·æ±å°ä¸»çåºéé¢ï¼ä¼å°å¢å æ¹çä¸è¥¿è®°å½å°binlogæ¥å¿éé¢. 2. 主ä»å¤å¶æ¯ä»åºå»æ¾ä¸»åºçï¼å»ºç«æ¶ï¼æä»¬å¨ä»åºä¸ä½¿ç¨change masteræå®masterçipï¼ç«¯å£ï¼äºè¿å¶æä»¶åç§°ï¼posï¼masterçå¯ç çä¿¡æ¯ãå¹¶å¨ä»åºä¸å¼å¯start slaveå°±ä¼å¼å¯åæ¥. 3. å¼å¯åæ¥åï¼å æ¯ä»å主å起请æ±ãç¶å主åºè¿è¡éªè¯ä»åºæ¯å¦æ£å¸¸ï¼éªè¯ä¹åï¼ä¸»åºå°±ä¼ç»ä»åºæç §ä¿¡æ¯å鿥å¿. 4. ä»åºä¸åæ¾æ¥å¿çå°æ¹å«åä¸ç»§æ¥å¿ï¼relay logï¼ï¼å ¶å®ä»åºéé¢è¿æä¸ä¸ªmaster infoä¿¡æ¯ï¼è¿ä¸ªéé¢è®°å½çæ¯change masterçä¿¡æ¯ï¼æ¯ä¸æ¬¡åæ¥å¿åæ¥é½ä¼å¯¹ä»åºçmaster infoä¿¡æ¯è¿è¡æ´æ°ï¼æ¥ä¸æ¥ä»åºæ ¹æ®master infoçbinlogä¿¡æ¯å»ä¸»åºå¨åè·æ°çbinlogä¿¡æ¯ï¼ ä»åºçio线ç¨ä¼å®æ¶ä¾æ®master.infoä¿¡æ¯çå»ä¸»åºçbinlogæ¥å¿éé¢è¯»åæ´æ°çå 容ï¼å°æ´æ°çå 容ååå°èªå·±çä¸ç»§æ¥å¿ä¸ï¼åæ¶ä¼æ´æ°master.infoä¿¡æ¯ï¼æ¤æ¶sql线ç¨å®æ¶ä¼ä»ä¸ç»§æ¥å¿ä¸è¯»åå¹¶æ§è¡éé¢çsqlè¯å¥ã # MySQLäºå¡åç ACIDæ¯éè¿redo å undo æ¥å¿æä»¶å®ç°çï¼ä¸ç®¡æ¯redoè¿æ¯undoæä»¶é½ä¼æä¸ä¸ªç¼åæä»¬ç§°ä¹ä¸ºredo_bufåundo_bufãåæ ·ï¼æ°æ®åºæä»¶ä¹ä¼æç¼åç§°ä¹ä¸ºdata_bufã ## undo æ¥å¿æä»¶ undoè®°å½äºæ°æ®å¨äºå¡å¼å§ä¹åçå¼ï¼å½äºå¡æ§è¡å¤±è´¥æè ROLLBACKæ¶å¯ä»¥éè¿undoè®°å½ç弿¥æ¢å¤æ°æ®ãä¾å¦ AAåBBçåå§å¼åå«ä¸º3ï¼5ã ``` A äºå¡å¼å§ B è®°å½AA=3å°undo_buf C ä¿®æ¹AA=1 D è®°å½BB=5å°undo_buf E ä¿®æ¹BB=7 F å°undo_bufåå°undo(ç£ç) G å°data_bufåå°datafile(ç£ç) H äºå¡æäº¤ ``` 1. 妿äºå¡å¨Fä¹åå´©æºç±äºæ°æ®è¿æ²¡åå ¥ç£çï¼æä»¥æ°æ®ä¸ä¼è¢«ç ´åã 2. 妿äºå¡å¨Gä¹åå´©æºæè åæ»åå¯ä»¥æ ¹æ®undoæ¢å¤å°åå§ç¶æã 使¯å纯使ç¨undoä¿è¯ååæ§åæä¹ æ§éè¦å¨äºå¡æäº¤ä¹åå°æ°æ®åå°ç£çï¼æµªè´¹å¤§éI/Oã ## redo/undoæ¥å¿æä»¶ å¼å ¥redoæ¥å¿è®°å½æ°æ®ä¿®æ¹åçå¼ï¼å¯ä»¥é¿å æ°æ®å¨äºå¡æäº¤ä¹åå¿ é¡»åå ¥å°ç£ççéæ±ï¼åå°I/Oã ``` A äºå¡å¼å§ B è®°å½AA=3å°undo_buf C ä¿®æ¹AA=1 è®°å½redo_buf D è®°å½BB=5å°undo_buf E ä¿®æ¹BB=7 è®°å½redo_buf F å°redo_bufåå°redoï¼ç£çï¼ G äºå¡æäº¤ ``` éè¿undoä¿è¯äºå¡çååæ§ï¼redoä¿è¯æä¹ æ§ã 1. Fä¹åå´©æºç±äºæææ°æ®é½å¨å åï¼æ¢å¤åéæ°å²ç£çè½½å ¥ä¹åçæ°æ®ï¼æ°æ®æ²¡æè¢«ç ´åã 2. FGä¹é´çå´©æºå¯ä»¥ä½¿ç¨redoæ¥æ¢å¤ã 3. Gä¹åçåæ»é½å¯ä»¥ä½¿ç¨undoæ¥å®æã # 为ä»ä¹ç¨èªå¢åä½ä¸ºä¸»é® 1. 妿æä»¬å®ä¹äºä¸»é®(PRIMARY KEY)ï¼é£ä¹InnoDBä¼éæ©ä¸»é®ä½ä¸ºèéç´¢å¼ãå¦ææ²¡ææ¾å¼å®ä¹ä¸»é®ï¼åInnoDBä¼éæ©ç¬¬ä¸ä¸ªä¸å 嫿NULLå¼çå¯ä¸ç´¢å¼ä½ä¸ºä¸»é®ç´¢å¼ã妿乿²¡æè¿æ ·çå¯ä¸ç´¢å¼ï¼åInnoDBä¼éæ©å ç½®6åèé¿çROWIDä½ä¸ºéå«çèéç´¢å¼(ROWIDéçè¡è®°å½çåå ¥è主é®éå¢ï¼è¿ä¸ªROWIDä¸åORACLEçROWID飿 ·å¯å¼ç¨ï¼æ¯éå«ç)ã 2. æ°æ®è®°å½æ¬èº«è¢«åäºä¸»ç´¢å¼ï¼ä¸é¢B+Treeï¼çå¶åèç¹ä¸ãè¿å°±è¦æ±åä¸ä¸ªå¶åèç¹å ï¼å¤§å°ä¸ºä¸ä¸ªå å页æç£ç页ï¼çåæ¡æ°æ®è®°å½æä¸»é®é¡ºåºåæ¾ï¼å æ¤æ¯å½æä¸æ¡æ°çè®°å½æå ¥æ¶ï¼MySQL伿 ¹æ®å ¶ä¸»é®å°å ¶æå ¥éå½çèç¹åä½ç½®ï¼å¦æé¡µé¢è¾¾å°è£ è½½å åï¼InnoDBé»è®¤ä¸º15/16ï¼ï¼åå¼è¾ä¸ä¸ªæ°ç页ï¼èç¹ï¼ 3. å¦æè¡¨ä½¿ç¨èªå¢ä¸»é®ï¼é£ä¹æ¯æ¬¡æå ¥æ°çè®°å½ï¼è®°å½å°±ä¼é¡ºåºæ·»å å°å½åç´¢å¼èç¹çåç»ä½ç½®ï¼å½ä¸é¡µå满ï¼å°±ä¼èªå¨å¼è¾ä¸ä¸ªæ°ç页 4. å¦æä½¿ç¨éèªå¢ä¸»é®ï¼å¦æèº«ä»½è¯å·æå¦å·çï¼ï¼ç±äºæ¯æ¬¡æå ¥ä¸»é®çå¼è¿ä¼¼äºéæºï¼å æ¤æ¯æ¬¡æ°çºªå½é½è¦è¢«æå°ç°æç´¢å¼é¡µå¾ä¸é´æä¸ªä½ç½®ï¼æ¤æ¶MySQLä¸å¾ä¸ä¸ºäºå°æ°è®°å½æå°åéä½ç½®èç§»å¨æ°æ®ï¼çè³ç®æ 页é¢å¯è½å·²ç»è¢«ååå°ç£çä¸èä»ç¼å䏿¸ æï¼æ¤æ¶åè¦ä»ç£çä¸è¯»åæ¥ï¼è¿å¢å äºå¾å¤å¼éï¼åæ¶é¢ç¹çç§»å¨ãå页æä½é æäºå¤§éçç¢çï¼å¾å°äºä¸å¤ç´§åçç´¢å¼ç»æï¼åç»ä¸å¾ä¸éè¿OPTIMIZE TABLEæ¥é建表并ä¼åå¡«å 页é¢ã # Joinçå®ç°åç MySQLæ¯åªæ¯æä¸ç§JOINç®æ³Nested-Loop Joinï¼åµå¥å¾ªç¯é¾æ¥ï¼ï¼ä»æ²¡æå ¶ä»å¾å¤æ°æ®åºææä¾çHash Joinï¼åå¸é¾æ¥ï¼ï¼ä¹æ²¡æSort-Merge Joinï¼å并龿¥ï¼ã å½è¿è¡å¤è¡¨è¿æ¥æ¥è¯¢æ¶ï¼ 驱å¨è¡¨ çå®ä¹ä¸ºï¼ 1. æå®äºèæ¥æ¡ä»¶æ¶ï¼æ»¡è¶³æ¥è¯¢æ¡ä»¶çè®°å½è¡æ°å°ç表为驱å¨è¡¨ 2. æªæå®èæ¥æ¡ä»¶æ¶ï¼è¡æ°å°ç表为驱å¨è¡¨ Nested-Loop Joinå®é ä¸å°±æ¯æ¯éè¿é©±å¨è¡¨çç»æéä½ä¸ºå¾ªç¯åºç¡æ°æ®ï¼ç¶å䏿¡ä¸æ¡å°éè¿è¯¥ç»æéä¸çæ°æ®ä½ä¸ºè¿æ»¤æ¡ä»¶å°ä¸ä¸ä¸ªè¡¨ä¸æ¥è¯¢æ°æ®ï¼ç¶ååå¹¶ç»æãè¿ç»å为ä¸ç§ 1. Simple Nested-Loop Joinï¼ä»é©±å¨è¡¨ä¸ååºR1å¹é S表ææåï¼ç¶åR2ï¼R3,ç´å°å°R表ä¸çæææ°æ®å¹é å®ï¼ç¶ååå¹¶æ°æ® 2. Index Nested-Loop Joinï¼é©±å¨è¡¨ä¼æ ¹æ®å ³èåæ®µçç´¢å¼è¿è¡æ¥æ¾ï¼å½å¨ç´¢å¼ä¸æ¾å°äºç¬¦åçå¼ï¼åå表è¿è¡æ¥è¯¢ï¼ä¹å°±æ¯åªæå½å¹é å°ç´¢å¼ä»¥åæä¼è¿è¡å表ï¼å¦æé驱å¨è¡¨çå ³è鮿¯ä¸»é®çè¯ï¼è¿æ ·æ¥è¯´æ§è½å°±ä¼é常çé«ã 3. Block Nested-Loop Joinï¼å¦æJoinçåæ²¡æç´¢å¼ï¼è¿æ¶MySQLä¼ä¼å 使ç¨Block Nested-Loop Joinçç®æ³ï¼Block Nested-Loop Join对æ¯Simple Nested-Loop Joinå¤äºä¸ä¸ªä¸é´å¤ççè¿ç¨ï¼ä¹å°±æ¯join bufferï¼ä½¿ç¨join bufferå°é©±å¨è¡¨çæ¥è¯¢JOINç¸å ³åé½ç»ç¼å²å°äºJOIN BUFFERå½ä¸ï¼ç¶åæ¹éä¸é驱å¨è¡¨è¿è¡æ¯è¾ï¼å¯ä»¥å°å¤æ¬¡æ¯è¾åå¹¶å°ä¸æ¬¡ï¼éä½äºé驱å¨è¡¨ç访é®é¢çã ## ä¼å 1. 䏿¨èç¨joinï¼è®©mysqlèªå·±å³å®ï¼mysqlæ¥è¯¢ä¼åå¨ä¼èªå¨éæ©æ°æ®éæå°çé£å¼ 表ä½ä¸ºé©±å¨è¡¨ã 2. å 为ç¨left joinçæ¶åï¼å·¦è¾¹çæ¯é©±å¨è¡¨ï¼èèå°æ¥è¯¢æçï¼è½ç¨joinå°±ä¸è¦ç¨left\right join 使ç¨å¤è¿æ¥éå¸¸å½±åæ¥è¯¢æçï¼å°±ç®è¦ç¨ä¹è¦ç¨æ°æ®éæå°ç表ä½ä¸ºé©±å¨è¡¨æ¥é©±å¨å¤§è¡¨ï¼ä»¥æ¤ä¿è¯ï¼âæ°¸è¿ç¨å°ç»æé驱å¨å¤§ç»æéâï¼å°½å¯è½åå°JOINä¸Nested Loopçå¾ªç¯æ¬¡æ°ã # MySQLä¼å 1. å¼å¯æ¥è¯¢ç¼åï¼ä¼åæ¥è¯¢ 2. explainä½ çselectæ¥è¯¢ï¼è¿å¯ä»¥å¸®ä½ åæä½ çæ¥è¯¢è¯å¥ææ¯è¡¨ç»æçæ§è½ç¶é¢ãEXPLAIN çæ¥è¯¢ç»æè¿ä¼åè¯ä½ ä½ çç´¢å¼ä¸»é®è¢«å¦ä½å©ç¨çï¼ä½ çæ°æ®è¡¨æ¯å¦ä½è¢«æç´¢åæåºç 3. å½åªè¦ä¸è¡æ°æ®æ¶ä½¿ç¨limit 1ï¼MySQLæ°æ®åºå¼æä¼å¨æ¾å°ä¸æ¡æ°æ®å忢æç´¢ï¼è䏿¯ç»§ç»å¾åæ¥å°ä¸ä¸æ¡ç¬¦åè®°å½çæ°æ® 4. 为æç´¢åæ®µå»ºç´¢å¼ 5. ä½¿ç¨ ENUM è䏿¯ VARCHARï¼å¦æä½ æä¸ä¸ªåæ®µï¼æ¯å¦âæ§å«âï¼âå½å®¶âï¼âæ°æâï¼âç¶æâæâé¨é¨âï¼ä½ ç¥éè¿äºå段çå弿¯æéèä¸åºå®çï¼é£ä¹ï¼ä½ åºè¯¥ä½¿ç¨ ENUM è䏿¯VARCHARã 6. Prepared Statements Prepared Statementså¾ååå¨è¿ç¨ï¼æ¯ä¸ç§è¿è¡å¨åå°çSQLè¯å¥éåï¼æä»¬å¯ä»¥ä»ä½¿ç¨ prepared statements è·å¾å¾å¤å¥½å¤ï¼æ è®ºæ¯æ§è½é®é¢è¿æ¯å®å ¨é®é¢ãPrepared Statements å¯ä»¥æ£æ¥ä¸äºä½ ç»å®å¥½çåéï¼è¿æ ·å¯ä»¥ä¿æ¤ä½ çç¨åºä¸ä¼åå°âSQLæ³¨å ¥å¼âæ»å» 7. åç´å表 8. éæ©æ£ç¡®çåå¨å¼æ é对 Innodb åå¨å¼æçä¸å¤§ç¹æ§æï¼ä¸¤æ¬¡åï¼èªéåºåå¸ç´¢å¼ï¼æå ¥ç¼å²ï¼ 1. double writeï¼ä¸¤æ¬¡åï¼ä½ç¨ï¼å¯ä»¥ä¿è¯é¡µæåä¹åï¼æå¯æ¬ç´æ¥å¯ä»¥è¿è¡æ¢å¤ã 2. adaptive hash indexï¼èªéåºåå¸ç´¢å¼ï¼ä½ç¨ï¼Innodb åå¨å¼æä¼çæ§å¯¹è¡¨ä¸ç´¢å¼çæ¥æ¾ï¼å¦æè§å¯å°å»ºç«åå¸ç´¢å¼å¯ä»¥å¸¦æ¥é度ä¸çæåï¼å建ç«åå¸ç´¢å¼ã读åé度ä¸ä¹æææé«ã 3. insert buffer ï¼æå ¥ç¼å²ï¼ä½ç¨ï¼é对æ®éç´¢å¼çæå ¥æéæº IO åæé¡ºåº IOï¼å¹¶åå¹¶æå ¥ç£ç