(PSï¼æ«æé¦é¡µéé¢çäºç»´ç è¿ç¾¤ï¼å享æèªå·±å¨ççææ¯èµæç»å¤§å®¶ï¼å¸æå大家ä¸èµ·å¦ä¹ è¿æ¥ï¼)
ä¸é¢æ¯ä¸»è¦æ¯èªå·±çäºã髿§è½MySQLãåä¸äºå客åï¼æ¾äºä¸äºMySQLç¸å
³çé¢è¯é¢ï¼éè¿ç¿»ä¹¦ï¼æ¥èµæåçè§£çï¼ä¹åä¼ç»§ç»æ´æ°åå®åè¿ä¸é¨åå
容ã
#### [1.䏿¡MySQLæ´æ°è¯å¥çæ§è¡è¿ç¨æ¯ä»ä¹æ ·çï¼](#䏿¡MySQLæ´æ°è¯å¥çæ§è¡è¿ç¨æ¯ä»ä¹æ ·çï¼)
#### [2.è页æ¯ä»ä¹ï¼](#è页æ¯ä»ä¹ï¼)
#### [3.Checkpointæ¯ä»ä¹ï¼](#Checkpointæ¯ä»ä¹ï¼)
#### [4.undo logï¼redo logï¼bin logæ¯ä»ä¹ï¼](#undologï¼redologï¼binlogæ¯ä»ä¹ï¼)
#### [5.MySQLä¸çäºå¡æ¯ä»ä¹ï¼](#MySQLä¸çäºå¡æ¯ä»ä¹ï¼)
#### [6.MySQLçéç¦»çº§å«æ¯æä¹æ ·çï¼](#MySQLçéç¦»çº§å«æ¯æä¹æ ·çï¼)
#### [7.MVCCçå®ç°åçæ¯æä¹æ ·çï¼](#MVCCçå®ç°åçæ¯æä¹æ ·çï¼)
#### [8.MySQLæ¯æä¹è§£å³å¹»è¯»çé®é¢çï¼](#MySQLæ¯æä¹è§£å³å¹»è¯»çé®é¢çï¼)
#### [9.MySQL䏿åªäºéï¼](#MySQL䏿åªäºéï¼)
#### [10.Bæ æ¯ä»ä¹ï¼](#Bæ æ¯ä»ä¹ï¼)
#### [11.Bæ ä¸B+æ çåºå«æ¯ä»ä¹ï¼](#Bæ ä¸B+æ çåºå«æ¯ä»ä¹ï¼)
#### [12.ç´¢å¼æ¯ä»ä¹ï¼](#ç´¢å¼æ¯ä»ä¹ï¼)
#### [13.å符串索å¼åæ°åç±»åç´¢å¼çåºå«ï¼](#å符串索å¼åæ°åç±»åç´¢å¼çåºå«ï¼)
#### [14.unionåunion allçåºå«æ¯ä»ä¹ï¼](#unionåunionallçåºå«æ¯ä»ä¹ï¼)
#### [15.Joinç工使µç¨æ¯æä¹æ ·çï¼æä¹è¿è¡ä¼åï¼](#Joinç工使µç¨æ¯æä¹æ ·çï¼æä¹è¿è¡ä¼åï¼)
#### [16.èéç´¢å¼æ¯ä»ä¹ï¼](#èéç´¢å¼æ¯ä»ä¹ï¼)
#### [17.èåç´¢å¼æ¯ä»ä¹ï¼](#èåç´¢å¼æ¯ä»ä¹ï¼)
#### [18.è¦çç´¢å¼æ¯ä»ä¹ï¼](#è¦çç´¢å¼æ¯ä»ä¹ï¼)
#### [19.åªäºæ
åµä¸è¦å»ºç´¢å¼ï¼](#åªäºæ
åµä¸è¦å»ºç´¢å¼ï¼)
#### [20.主é®ï¼å¯ä¸æ§ç´¢å¼ï¼æ®éç´¢å¼çåºå«æ¯ä»ä¹ï¼](#主é®ï¼å¯ä¸æ§ç´¢å¼ï¼æ®éç´¢å¼çåºå«æ¯ä»ä¹ï¼)
#### [21.InnoDBåMyISAMçåºå«æ¯ä»ä¹ï¼](#InnoDBåMyISAMçåºå«æ¯ä»ä¹ï¼)
#### [22.ä»ä¹æ¯ååºå表ï¼](#ä»ä¹æ¯ååºå表ï¼)
#### [23.æä¹å®ç°è·¨åºå页æ¥è¯¢ï¼](#æä¹å®ç°è·¨åºå页æ¥è¯¢ï¼)
#### [24.MySQL主ä»å¤å¶ç工使µç¨æ¯ä»ä¹æ ·çï¼](#MySQL主ä»å¤å¶ç工使µç¨æ¯ä»ä¹æ ·çï¼)
#### [25.charç±»åä¸varcharç±»åçåºå«ï¼](#charç±»åä¸varcharç±»åçåºå«)
#### [26.æ¥è¯¢æ°éSELECT Count(*)æä¹ä¼åï¼](#æä¹ä¼åæ°éæ¥è¯¢ï¼)
#### [27.å¦ä½ä¼åMySQLæ
¢æ¥è¯¢ï¼](#å¦ä½ä¼åMySQLæ
¢æ¥è¯¢ï¼)
#### [28.MySQLçjoinçå®ç°æ¯æä¹æ ·çï¼](#MySQLçjoinçå®ç°æ¯æä¹æ ·çï¼)
### 䏿¡MySQLæ´æ°è¯å¥çæ§è¡è¿ç¨æ¯ä»ä¹æ ·çï¼

#### 1.è¿æ¥éªè¯åè§£æ
客æ·ç«¯ä¸MySQL Server建ç«è¿æ¥ï¼åéè¯å¥ç»MySQL Serverï¼æ¥æ¶å°åå¦ææ¯æ¥è¯¢è¯å¥ä¼å
廿¥è¯¢ç¼åä¸çï¼æçè¯å°±ç´æ¥è¿åäºï¼ï¼æ°çæ¬çMySQLå·²ç»åºé¤äºæ¥è¯¢ç¼åï¼å½ä¸ç太ä½äºï¼ï¼å¦ææ¯ç¼å没ææè
æ¯éæ¥è¯¢è¯å¥ï¼ä¼å建ä¸ä¸ªè§£ææ ï¼ç¶åè¿è¡ä¼åï¼ï¼è§£æå¨ç¥éè¯å¥æ¯è¦æ§è¡ä»ä¹ï¼ä¼è¯ä¼°ä½¿ç¨åç§ç´¢å¼ç代价ï¼ç¶åå»ä½¿ç¨ç´¢å¼ï¼ä»¥åè°è表çè¿æ¥é¡ºåºï¼ç¶åè°ç¨innodbå¼æçæ¥å£æ¥æ§è¡è¯å¥ã
#### 2.åundo log
innodb 弿é¦å
å¼å¯äºå¡ï¼å¯¹æ§æ°æ®çæä¸ä¸ªUPDATEçè¯å¥(妿æ¯insertä¼çædeleteè¯å¥)ï¼ç¨äºæäº¤å¤±è´¥ååæ»ï¼åå
¥undo logï¼å¾å°åæ»æéï¼å¹¶ä¸æ´æ°è¿ä¸ªæ°æ®è¡çåæ»æéåäºå¡idãï¼äºå¡æäº¤åï¼Undo logå¹¶ä¸è½ç«é©¬è¢«å é¤ï¼èæ¯æ¾å
¥å¾
æ¸
ççé¾è¡¨ï¼ç±purge 线ç¨å¤ææ¯å¦æå
¶ä»äºå¡å¨ä½¿ç¨undo 段ä¸è¡¨çä¸ä¸ä¸ªäºå¡ä¹åççæ¬ä¿¡æ¯ï¼å³å®æ¯å¦å¯ä»¥æ¸
çundo logçæ¥å¿ç©ºé´ï¼ç®åç说就æ¯çä¹åçäºå¡æ¯å¦æäº¤æåï¼è¿ä¸ªäºå¡åä¹åçäºå¡é½æäº¤æåäºï¼è¿é¨åundo logæè½å é¤ãï¼
#### 3.ä»ç´¢å¼ä¸æ¥æ¾æ°æ®
æ ¹æ®ç´¢å¼å»B+æ 䏿¾å°è¿ä¸è¡æ°æ®ï¼å¦ææ¯æ®éç´¢å¼ï¼æ¥å°ä¸ç¬¦åæ¡ä»¶çç´¢å¼ï¼ä¼ææææ°æ®æ¥æ¾åºæ¥ï¼å¯ä¸æ§ç´¢å¼æ¥å°ç¬¬ä¸ä¸ªæ°æ®å°±å¯ä»¥äºï¼
#### 4.æ´æ°æ°æ®
å¤ææ°æ®é¡µæ¯å¦å¨å
åä¸
#### 4.1æ°æ®é¡µå¨å
åä¸
ç´¢å¼æ¯
##### 4.1.1æ®éç´¢å¼
ç´æ¥æ´æ°å
åä¸çæ°æ®é¡µ
##### 4.1.2å¯ä¸æ§ç´¢å¼
å¤ææ´æ°åæ¯å¦ä¼æ°æ®å²çªï¼ä¸ä¼çè¯å°±æ´æ°å
åä¸çæ°æ®é¡µã
#### 4.2 æ°æ®é¡µä¸å¨å
åä¸
ç´¢å¼æ¯
##### 4.2.1æ®éç´¢å¼
å°å¯¹æ°æ®é¡µçæ´æ°æä½è®°å½å°change bufferï¼change bufferä¼å¨ç©ºé²æ¶å¼æ¥æ´æ°å°ç£çã
##### 4.2.2å¯ä¸æ§ç´¢å¼
å 为éè¦ä¿è¯æ´æ°åçå¯ä¸æ§ï¼æä»¥ä¸è½å»¶è¿æ´æ°ï¼å¿
é¡»ææ°æ®é¡µä»ç£çå è½½å°å
åï¼ç¶åå¤ææ´æ°åæ¯å¦ä¼æ°æ®å²çªï¼ä¸ä¼çè¯å°±æ´æ°æ°æ®é¡µã
#### 5.åundo logï¼prepareç¶æï¼
å°å¯¹æ°æ®é¡µçæ´æ¹åå
¥å°redo logï¼å°redo log设置为prepareç¶æã
#### 6.åbin logï¼commitç¶æï¼
éç¥MySQL serverå·²ç»æ´æ°æä½åå
¥å°redo log äºï¼éæ¶å¯ä»¥æäº¤ï¼å°æ§è¡çSQLåå
¥å°bin logæ¥å¿ï¼å°redo logæ¹æcommitç¶æï¼äºå¡æäº¤æåã
#### undo log
ä¸»è¦æ¯ä¿è¯äºå¡çååæ§ï¼äºå¡æ§è¡å¤±è´¥å°±åæ»ï¼ç¨äºå¨äºå¡æ§è¡å¤±è´¥åï¼å¯¹æ°æ®åæ»ã
æ¯é»è¾æ¥å¿ï¼è®°å½çæ¯SQL
å¨äºå¡æäº¤åï¼undo logæ¥å¿ä¸ä¼ç«å³å é¤ï¼ä¼æ¾å°ä¸ä¸ªå¾
å é¤çé¾è¡¨ä¸ï¼æpurge线ç¨å¤ææ¯å¦æå
¶ä»äºå¡å¨ä½¿ç¨ä¸ä¸ä¸ªäºå¡ä¹åççæ¬ä¿¡æ¯ï¼ç¶åå³å®æ¯å¦å¯ä»¥æ¸
çï¼ç®åçæ¥è¯´å°±æ¯åé¢çäºå¡é½æäº¤æåäºï¼è¿äºundoæè½å é¤ã
##### change bufferæ¯ä»ä¹ï¼å°±æ¯å°æ´æ°æ°æ®é¡µçæä½ç¼å䏿¥ï¼
卿´æ°æ°æ®æ¶ï¼
å¦ææ°æ®è¡æå¨çæ°æ®é¡µå¨å
åä¸ï¼ç´æ¥æ´æ°å
åä¸çæ°æ®é¡µã
妿ä¸å¨å
åä¸ï¼ä¸ºäºåå°ç£çIOçæ¬¡æ°ï¼innodbä¼å°è¿äºæ´æ°æä½ç¼åå¨change bufferä¸ï¼å¨ä¸ä¸æ¬¡æ¥è¯¢æ¶éè¦è®¿é®è¿ä¸ªæ°æ®é¡µæ¶ï¼å¨æ§è¡change bufferä¸çæä½å¯¹æ°æ®é¡µè¿è¡æ´æ°ã
éååå¤è¯»å°çåºæ¯ï¼å ä¸ºè¿æ ·å³ä¾¿ç«å³åäºï¼ä¹ä¸å¤ªå¯è½ä¼è¢«è®¿é®å°ï¼å»¶è¿æ´æ°å¯ä»¥åå°ç£çI/Oï¼åªææ®éç´¢å¼ä¼ç¨å°ï¼å 为å¯ä¸æ§ç´¢å¼ï¼å¨æ´æ°æ¶å°±éè¦å¤æå¯ä¸æ§ï¼æä»¥æ²¡æå¿
è¦ã
##### redo log
å°±æ¯ä¸ºäºä¿è¯äºå¡çæä¹
æ§ï¼å¨åæ°æ®æ´æ°æä½æ¶ï¼å
å°å¯¹æ°æ®é¡µçæ´æ¹è®°å½å°redo logï¼ç¶åå廿´æ°å
åä¸çæ°æ®é¡µï¼å¨ä¸æ¬¡æ¥è¯¢æ°æ®é¡µæè
ç©ºé²æ¶é´ï¼å°æä½è®°å½æ´æ°å°ç£çãè¿æ ·å¯ä»¥å°éæºI/Oæ¹ä¸ºé¡ºåºI/Oã
ä¼ç¹æ¯åå°ç£çI/O次æ°ï¼å³ä¾¿åçæ
éä¹å¯ä»¥æ ¹æ®redo logæ¥å°æ°æ®æ¢å¤å°ææ°ç¶æã
ç¼ºç¹æ¯ä¼é æå
åè页ï¼åå°çº¿ç¨ä¼èªå¨å¯¹è页å·çï¼æè
æ¯æ·æ±°æ°æ®é¡µæ¶å·çï¼æ¤æ¶ä¼ææ¶æ¥è¯¢æä½ï¼å½±åæ¥è¯¢ã
#### äºæ®µæäº¤å¶
æ´æ°æ¶ï¼å
æ¹å
åä¸çæ°æ®é¡µï¼å°æ´æ°æä½åå
¥redo logæ¥å¿ï¼æ¤æ¶redo logè¿å
¥prepareç¶æï¼ç¶åéç¥MySQL Serveræ§è¡å®äºï¼éæ¶å¯ä»¥æäº¤ï¼MySQL Serverå°æ´æ°çSQLåå
¥bin logï¼ç¶åè°ç¨innodbæ¥å£å°redo log设置为æäº¤ç¶æï¼æ´æ°å®æã
å¦æåªæ¯åäºbin logå°±æäº¤ï¼é£ä¹å¿½ç¶åçæ
éï¼ä¸»èç¹å¯ä»¥æ ¹æ®redo logæ¢å¤æ°æ®å°ææ°ï¼ä½æ¯ä¸»ä»åæ¥æ¶ä¼ä¸¢æè¿é¨åæ´æ°çæ°æ®ã
å¦æåªæ¯åbinlogï¼ç¶ååredo logï¼å¦æå¿½ç¶åçæ
éï¼ä¸»èç¹æ ¹æ®redo logæ¢å¤æ°æ®æ¶å°±ä¼ä¸¢æè¿é¨åæ°æ®ã
##### å´©æºæ¢å¤æ¶ç夿è§åï¼ä»¥redologæ¯å¦commitæè
binlogæ¯å¦å®æ´æ¥ç¡®å®ï¼
1. 妿 redo log éé¢çäºå¡æ¯å®æ´çï¼ä¹å°±æ¯å·²ç»æäº commit æ è¯ï¼åç´æ¥æäº¤ï¼
2. 妿 redo log éé¢çäºå¡åªæå®æ´ç prepareï¼å夿坹åºçäºå¡ binlog æ¯å¦åå¨å¹¶å®æ´ï¼
a. 妿æ¯ï¼åæäº¤äºå¡ï¼
b. å¦åï¼åæ»äºå¡ã
åèèµæï¼
https://gsmtoday.github.io/2019/02/08/how-update-executes-in-mysql/
https://www.infoq.cn/article/M6g1yjZqK6HiTIl_9bex
### è页æ¯ä»ä¹ï¼
å°±æ¯å
åæ°æ®é¡µä¸ç£çå
å页çå
容ä¸ä¸è´æ¶çå
å页å«åè页ãå
åé¡µæ°æ®åå
¥ç£çåï¼æ°æ®ä¸è´äºï¼å°±æ¯å¹²å页äºã
å·è页çåºæ¯
1.redo log åæ»¡äºï¼ç³»ç»ä¼åæ¢æææ´æ°æä½ï¼å°checkpointå忍è¿ï¼å°æ¨è¿è¿é¨åæ¥å¿çèé¡µæ´æ°å°ç£çã
2.ç³»ç»å
åä¸å¤ï¼éè¦å°ä¸é¨åæ°æ®é¡µæ·æ±°ï¼å¦ææ¯å¹²å页ï¼ç´æ¥æ·æ±°å°±è¡äºï¼è页çè¯ï¼éè¦å
¨é¨åæ¥å°ç£çã
3.MySQLèªè®¤ä¸ºç©ºé²æ¶å»å·è页ã
4.MySQLæ£å¸¸å
³éä¹åï¼ä¼å°è页å·å
¥ç£çã
### Checkpointæ¯ä»ä¹ï¼
å°±æ¯ç³»ç»æ
éåï¼æ ¹æ®redoæ¥æ¢å¤æ°æ®æ¶ï¼ä¸éè¦éåæææ¥å¿ï¼åªéè¦éåcheckpointç¹ä¹åçæ¥å¿ï¼å 为redo logä¹ä¸è½æ éå¤§ï¼æä»¥å½redo log空é´ä¸è¶³æ¶ï¼redo logä¸é£é¨åè¢«æ´æ°å°ç£ççæ¥å¿å¯ä»¥è¦çéç¨ã
1ãç¼©çæ°æ®åºçæ¢å¤æ¶é´ï¼
2ãç¼å²æ± ä¸å¤ç¨æ¶ï¼å°è页巿°å°ç£çï¼
3ãé忥å¿ç©ºé´ä¸è¶³æ¶ï¼å·æ°è页ã
### undologï¼redologï¼binlogæ¯ä»ä¹ï¼
##### undo log æ¯ä»ä¹ï¼
undo logæ¯ä¸ç§é»è¾æ¥å¿ï¼æ¯æ§æ°æ®çå¤ä»½ãæä¸¤ä¸ªä½ç¨ç¨äºäºå¡åæ»åMVCCã
æ§è¡ä¸æ¡INSERTè¯å¥æ¶ï¼ä¼è®°å½ä¸æ¡ç¸åçDELETEè¯å¥å°æ¥å¿ï¼æ§è¡ä¸æ¡UPDATEè¯å¥æ¶ï¼ä¼è®°å½ä¸æ¡ç¸åçUPDATEè¯å¥å°æ¥å¿ä¸ã
##### redo logæ¯ä»ä¹ï¼
redo logç¨äºä¿è¯æ°æ®çæä¹
æ§ãredo logè®°å½çæ¯æ°æ®é¡µçç©çååï¼æ¯æ°æ°æ®çå¤ä»½ï¼å¨äºå¡æäº¤åï¼å°redo log æä¹
åå°±è¡ï¼ä¸éè¦å°æ°æ®æä¹
åï¼ç³»ç»å´©æºæ¶ï¼å¯ä»¥æ ¹æ®redo logå°æ°æ®æ¢å¤å°ææ°ç¶æã
redo logåªå顺åºè¿½å æä½ï¼å½äºå¡éè¦åæ»æ¶ï¼å¨redo logä¸ä¹ä¸ä¼å é¤ä¹åçäºå¡è®°å½ã
é»è®¤æ¯æ¯æ¬¡äºå¡æäº¤æ¶å¿
é¡»è°ç¨fsyncæä½å°redoç¼å²åºçå
容åå
¥ç£ç
ä¾å¦å°A=1ä¿®æ¹ä¸ºA=2
äºå¡å¼å§
å°åå§æ°æ®A=1ä»ç£ç读åå°å
åï¼
ä¿®æ¹A=2ï¼
çæä¸æ¡redo log åå
¥å°redo log ç¼å²åº
è°ç¨fsyncæä½å°redo log ç¼å²åºçå
容åå
¥å°ç£ç
äºå¡æäº¤ã
##### Bin log æ¯ä»ä¹ï¼
ä¿åçæ¯é»è¾æ¥å¿ï¼ä¸»è¦æ¯å卿¯ä¸æ¡ä¼ä¿®æ¹æ°æ®çSQLã
### MySQLä¸çäºå¡æ¯ä»ä¹ï¼
ç±ä¸ç³»åæ°æ®åºæä½ç»æçé»è¾è¿ç¨ï¼å¯ä»¥æ¯ä¸ä¸ªSQLæ¥è¯¢ï¼ä¹å¯ä»¥æ¯ä¸ç»SQLæ¥è¯¢ã
å
·å¤åä¸ªç¹æ§ï¼ä¹å°±æ¯acid
ååæ§ï¼ä¸ä¸ªäºå¡å°±æ¯æå°çå·¥ä½åå
ï¼è¦ä¹æ§è¡æåæäº¤ï¼è¦ä¹æ§è¡å¤±è´¥åæ»ã
ä¸è´æ§ï¼å°±æ¯äºå¡çæ§è¡ä¸ä¼å½±åæ°æ®åºç宿´æ§ï¼ä¾å¦æ§è¡å°ä¸åæ¶åçæ
éï¼é£ä¹å·²ç»è¿è¡çä¿®æ¹ä¼åæ»ã
é离æ§ï¼å°±æ¯äºå¡å¨æ§è¡è¿ç¨ä¸ï¼ä¸¤ä¸ªäºå¡ä¹é´æ¯é离çï¼äºå¡å¨æ§è¡æåä¹åï¼æåçä¿®æ¹å¯¹å
¶ä»äºå¡æ¯ä¸å¯è§çã
æä¹
æ§ï¼äºå¡æ§è¡æååï¼å¯¹æ°æ®çä¿®æ¹æ¯æ°¸ä¹
çï¼å³ä¾¿æ
éä¹ä¸ä¼ä¸¢å¤±ã
### MySQLçéç¦»çº§å«æ¯æä¹æ ·çï¼
##### æªæäº¤è¯»
äºå¡è¿æ²¡ææäº¤çä¿®æ¹ï¼å
¶ä»äºå¡é½å¯ä»¥è¯»åå°ãå¯è½ä¼æè读çé®é¢ï¼å°±æ¯è¯»å°ä¸äºæªæäº¤çèæ°æ®ã
##### æäº¤è¯»
å
¶ä»äºå¡æäº¤çä¿®æ¹ï¼äºå¡å¨æ§è¡è¿ç¨ä¸å¯ä»¥è¯»åå°ï¼å¦æä¸ä¸ªäºå¡å¨æ§è¡è¿ç¨ä¸éè¦ä¸¤æ¬¡è¯»ååä¸è¡æ°æ®ï¼å¯è½ä¼ä¸ä¸è´ãä¸è¬åçå¨UPDATEåDELETEæä½ãï¼å¤§é¨åæ°æ®åºç³»ç»æ¯éç¨çè¿ä¸ªï¼ä½æ¯mysql䏿¯ï¼
è¿ä¸ªé离级å«ä¸ï¼è¯»æ¯ä¸å éçï¼åï¼æ´æ°ï¼å 餿¯å éçï¼å¦ææ´æ°çè¡æ¯å¯ä»¥éè¿ç´¢å¼æ¥æ¾å°ï¼é£ä¹æ¯å¯¹è¿äºè¡å è¡éï¼å¦åä¼å°ææè¡é½å éï¼ç¶åè¿åç»Mysql Serverï¼è®©ä»æ¥è¿è¡è¿æ»¤ï¼å¯¹äºä¸æ»¡è¶³æ¡ä»¶çè¡è§£éã
##### å¯éå¤è¯»
å¨äºå¡å¼å§æ¶ï¼è®°å½å½æ¶çç¶æï¼å¨ç¬¬äºæ¬¡è¯»ååä¸è¡æ°æ®æ¶ï¼é¤éæ¯æ¬äºå¡åçä¿®æ¹ï¼å¦å读åç齿¯äºå¡å¼å§æ¶çæ°æ®ãå¯ä»¥è§£å³è读çé®é¢ï¼æ²¡æ³è§£å³å¹»è¯»çé®é¢ãè¿æ¯mysqlçé»è®¤äºå¡é离级å«ã使¯è¿æ¯ä¼æå¹»è¯»çé®é¢(幻读就æ¯äºå¡Aå¨è¯»åååå
¥ç¬¦åçæ¡ä»¶çè®°å½æ¶ï¼å
¶ä»äºå¡åæå
¥äºä¸æ¡ç¬¦åæ¡ä»¶çè®°å½ï¼æ¤æ¶äºå¡Aè¯»åæ¶ä¼äº§çå¹»è¡ï¼ä¸è¬åçå¨INSERTæä½ã)
##### å¯ä¸²è¡å
强å¶äºå¡ä¸²è¡æ§è¡ï¼ä¼è®©è¯»åæ¯ä¸è¡é½å éï¼è¯»ç¨è¯»éï¼åç¨åéï¼è¯»åéäºæ¥ï¼å¯ä»¥è§£å³å¹»è¯»çé®é¢ã并忝è¾å¤çè¯å¯è½ä¼é æå¤§éçè¶
æ¶çå¾
åéç«äºã妿ä¸å¡å¹¶åçç¹å«å°æè
没æå¹¶åï¼åæ¶åè¦æ±æ°æ®åæ¶å¯é çè¯
### MVCCçå®ç°åçæ¯æä¹æ ·çï¼
mvcc主è¦éç¨äºæäº¤è¯»ï¼å¯éå¤è¯»ï¼å¯ä»¥è§£å³å¹»è¯»çé®é¢ã
innodbå¨è§£å³å¹»è¯»çé®é¢ä¸»è¦æ¯éMVVC å¤çæ¬å¹¶åçæ¬æ§å¶æ¥å®ç°ç
å°±æ¯æ¯ä¸è¡æ°æ®ä¸é¢å¤ä¿å两个éèçåï¼å建æ¶ççæ¬å·ï¼å 餿¶ççæ¬å·ï¼å¯è½ä¸ºç©ºï¼ï¼æ»å¨æé(æåundo logä¸ç¨äºäºå¡åæ»çæ¥å¿è®°å½)
1.äºå¡å¨å¯¹æ°æ®ä¿®æ¹åï¼è¿è¡ä¿åæ¶ï¼å¦ææ°æ®è¡çå½åçæ¬å·ä¸äºå¡å¼å§å徿°æ®ççæ¬å·ä¸è´å°±ä¿åæåï¼å¦åä¿å失败ã
##### æå
¥æä½
æ¯æ¬¡å¼å§äºå¡æ¶ï¼ä¼å¯¹ç³»ç»çæ¬å·+1ä½ä¸ºå½åäºå¡ççæ¬å·ã
æå
¥æ°æ®åï¼å°äºå¡ççæ¬å·ä½ä¸ºæ°æ®è¡çåå»ºçæ¬å·ã
##### å 餿ä½
å°å½åçäºå¡çæ¬å·ä½ä¸ºæ°æ®è¡çå é¤çæ¬å·ã
##### æ´æ°æä½
æå
¥ä¸æ¡æ°çæ°æ®ï¼å°äºå¡ççæ¬å·ä½ä¸ºæ°æ®è¡çåå»ºçæ¬å·ï¼å¹¶ä¸å°å½åäºå¡çæ¬å·ä½ä¸ºæ§æ°æ®çå é¤çæ¬å·ã
##### æ¥è¯¢æä½
æ°æ®è¡è¦è¢«æ¥è¯¢åºæ¥å¿
须满足两个æ¡ä»¶ï¼
å é¤çæ¬å·ä¸ºç©ºæè
>å½åäºå¡çæ¬å·çæ°æ®(å¦åæ°æ®å·²ç»è¢«æ è®°å é¤äº)
åå»ºçæ¬å·<=å½åäºå¡çæ¬å·çæ°æ®ï¼å¦åæ°æ®æ¯åé¢çäºå¡åå»ºåºæ¥çï¼
妿æ¥è¯¢æ¶ï¼è¯¥è¡æ°æ®è¢«å äºXéï¼é£ä¹è¯»æ°æ®çäºå¡ä¸ä¼è¿è¡çå¾
ï¼èæ¯åå»undo log端éé¢è¯»ä¹åçæ¬çæ°æ®ï¼è¿éåå¨çæ°æ®æ¬èº«æ¯ç¨äºåæ»çï¼ï¼å¨å¯éå¤è¯»çé离级å«ä¸ï¼ä»undo logä¸è¯»åçæ°æ®æ»æ¯äºå¡å¼å§æ¶çå¿«ç
§æ°æ®(ä¹å°±æ¯çæ¬å·å°äºå½åäºå¡idçæ°æ®)ï¼å¨æäº¤è¯»çé离级å«ä¸ï¼ä»undo logä¸è¯»åçæ»æ¯ææ°çå¿«ç
§æ°æ®ã
### MySQLæ¯æä¹è§£å³å¹»è¯»çé®é¢çï¼
幻读就æ¯äºå¡æ§è¡è¿ç¨ä¸ï¼å¨æ¥è¯¢ä¸ä¸ªèå´çæ°æ®æ¶ï¼ææ°çæ°æ®æå
¥å°è¿ä¸ªèå´ï¼å¯¼è´ä¸¤æ¬¡æ¥è¯¢çæ°æ®ä¸ä¸è´ãå 为读å为快ç
§è¯»å宿¶è¯»ï¼
å¿«ç
§è¯»
æä»¬æ®éçSELECTè¯å¥é½æ¯æ®é读ï¼ä¹å°±æ¯è¯»åçæ°æ®é½æ¯äºå¡å¼å§æ¶é£ä¸ªç¶æçæ°æ®ï¼æ®é读ç幻读é®é¢ä¸»è¦æ¯éè¿MVCCæ¥è§£å³çï¼å
·ä½å¯ä»¥çä¸é¢çMVCCä¸çæ¥è¯¢æä½ã
宿¶è¯»
SELECT *** FOR UPDATE 卿¥è¯¢æ¶ä¼å
ç³è¯·Xé
SELECT *** IN SHARE MODE 卿¥è¯¢æ¶ä¼å
ç³è¯·Sé
å°±æ¯å®æ¶è¯»ï¼å°±æ¯è¯»åçæ¯å®æ¶çæ°æ®ï¼èä¸å¿«ç
§æ°æ®ï¼è¯»çæ¶åä¼å Next-Key Lockéä½å½åçè®°å½ï¼ä»¥åå·¦å³ä¸¤ä¸ªåºé´çé´éï¼è¿æ ·å¨è¯»çæ¶åå°±ä¸è½å¾æä»¬çæ¥è¯¢èå´æå
¥æ°æ®äºã
### MySQL䏿åªäºéï¼
#### å
¨å±é
å°±æ¯å¯¹æ´ä¸ªæ°æ®åºå éï¼è®©æ´ä¸ªæ°æ®åºå¤äºåªè¯»ç¶æï¼æææ´æ°æä½åæ¢ãï¼å¦ææ¯ä¸»åºå°±ä¸è½æ§è¡æ´æ°è¯å¥ï¼ä»åºä¹ä¸è½æ§è¡åæ¥è¿æ¥çbin logï¼
æå¸¸ç¨çåºæ¯æ¯å¯¹æ°æ®åºå éï¼è®©æ°æ®åºåªè½è¯»ï¼ç¶å对æ´ä¸ªæ°æ®åºåé»è¾å¤ä»½ï¼å°±æ¯å°æææ°æ®çæSQLåå
¥å¤ä»½æä»¶ãï¼
åé»è¾å¤ä»½æä¸ç§æ¹å¼ï¼
##### 1.å
¨å±é
å¯¹æ°æ®åºæ§è¡
Flush tables with read lockå½ä»¤è®©æ´ä¸ªåºå¤äºåªè¯»ç¶æã
##### 2.å©ç¨innodbçäºå¡é离æ§ï¼å¯éå¤è¯»ï¼
å°±æ¯éè¿å®æ¹èªå¸¦çé»è¾å¤ä»½å·¥å
·mysqldumpæ¥è¿è¡é»è¾å¤ä»½æ¶ï¼å¯ä»¥è®¾ç½®ä¸ä¸ªåæ°-single-transactionï¼è¿æ ·å¯¼æ°æ®çæ¶åå°±ä¼å¼å¯ä¸ä¸ªäºå¡ï¼è¿æ ·å©ç¨innodbçmvccæºå¶å¯ä»¥ä¿è¯å¨äºå¡æ§è¡è¿ç¨ä¸ï¼è¯»å°çæ°æ®é½è·äºå¡å¼å§æ¶çä¸è´ï¼å¹¶ä¸æ§è¡è¿ç¨ä¸ï¼å
¶ä»äºå¡å¯ä»¥æ§è¡æ´æ°æä½ï¼ ä¸ä¼å¯¹ä»é æå½±åãè¿ç§æ¹æ³å¿
é¡»è¦æ±æ°æ®åºææè¡¨ç弿齿¯innodbæè¡ã
##### 3.set global readonly=true
æ§è¡è¿ä¸ªå½ä»¤ä¹å¯ä»¥è®©å
¨åºåªè½è¯»ï¼ä½æ¯ç¬¬ä¸æäºç³»ç»ä¼ä½¿ç¨readonlyæ¥åä¸ä¸ªæä½ï¼ä¾å¦æ ¹æ®readonlyæ¯å¦ä¸ºtrueå¤ææ°æ®åºæ¯å¦æ¯ä»åºï¼ç¬¬äºæ¯å¦ææ§è¡è¿ä¸ªå½ä»¤åï¼å®¢æ·ç«¯æå¼è¿æ¥åï¼æ°æ®åºä¼ä¸ç´å¤äºåªè¯»ç¶æï¼å¦ææ¯FTWRLå½ä»¤åéå¼å¸¸ä¼éæ¾å
¨å±éãï¼å¦ææ¯ä»åºï¼è®¾ç½®read-only对super useræéæ æï¼
### 表级é
表级å«çéæä¸¤ç§ï¼ä¸ç§æ¯è¡¨éï¼ä¸ç§æ¯å
æ°æ®éMDLã
##### 表é lock table
å°±æ¯ä½¿ç¨lock table user_table read/writeå½ä»¤æ¥å¯¹è¡¨è¿è¡å 读éæè
åé
å 读éåï¼è¡¨å¯¹ææçº¿ç¨é½æ¯åªè½è¯»ï¼å³ä¾¿æ¯å½å线ç¨ä¹åªè½è¯»è¡¨ï¼ä¸ç¶ä¼æ°æ®ä¸ä¸è´ã
å åéåï¼è¡¨æ¯å¯¹å½å线ç¨åï¼å
¶ä»çº¿ç¨ä¸è½è¯»ï¼ä¸è½åæ°æ®ä¸ä¸è´ã
å¯ä»¥éè¿unlock tablesæ¥è§£éï¼å®¢æ·ç«¯æå¼æ¶ä¹ä¼èªå¨éæ¾éï¼ä½æ¯å½±åææçº¿ç¨ï¼å½±åé¢å¤ªå¤§äºã
##### å
æ°æ®éMDL(MetaData Lock)
å为读éååéï¼å è¯»éæ¶ï¼ææç线ç¨é½å¯ä»¥è¯»è¡¨ï¼å åéæ¶ï¼åªè½ä¸ä¸ªçº¿ç¨åï¼å
¶ä»çä¸è½è¯»ã
éä¸ç¨æ¾å¼ä½¿ç¨ï¼æ¯è®¿é®ä¸ä¸ªè¡¨æ¶ï¼èªå¨å ä¸çã
对表è¿è¡å¢å æ¹æ¥æ¶ï¼ä¼å 读éã
å¯¹è¡¨ç»æåä¿®æ¹æ¶ï¼ä¼å åéã
ç®çæ¯ä¸ºäºå¨å¢å æ¹æ¥æ¶ä¸è½ä¿®æ¹è¡¨ç»æï¼ä¿®æ¹è¡¨ç»ææ¶ä¸è½å»å¢å æ¹æ¥ã
##### èªå¢é
æå
¥è¯å¥ä¸»è¦å为两ç§ï¼
1.è½ç¡®å®æå
¥è¡æ°çï¼ä¾å¦æå
¥ä¸æ¡æè
夿¡æ°æ®ï¼INSERT...
2.ä¸è½ç¡®å®è¡æ°çï¼ä¾å¦ä»ä¸ä¸ªè¡¨æ¥è¯¢åºæ»¡è¶³æ¡ä»¶çæ°æ®ï¼ç¶åæå
¥å¦å¤ä¸ä¸ªè¡¨ï¼INSERT...SELECT
å¨æææ¨¡å¼ä¸ï¼å¦æä¸ä¸ªäºå¡åæ»ï¼è¿äºèªå¢å¼å°è¢«â丢失âã
innodb_autoinc_lock_mode为0
è¿ç§æ¯tradition模å¼ï¼æ¯æ¬¡æ§è¡ä¸æ¡æå
¥è¯å¥æ¶é½ä¼å»ç³è¯·è¡¨çº§å«çauto_incrementé
innodb_autoinc_lock_mode为1
è¿ç§æ¯consecutive模å¼ï¼æ§è¡ä¸ç¡®å®æ°éçæå
¥è¯å¥æ¶ï¼æä¼å»ç³è¯·è¡¨çº§å«çauto_incrementéï¼
æ§è¡ç¡®å®æ°éçæå
¥è¯å¥æ¶ï¼åªéè¦æ§è¡åå»è·å AUTO_INCREMENT 计æ°å¨çäºæ¥éå¹¶å¨è·å主é®åç´æ¥éæ¾ï¼
ä¸éè¦çå¾
å½åè¯å¥æ§è¡å®æã
innodb_autoinc_lock_mode为2
äº¤åæ¨¡å¼ ææçæå
¥è¯å¥é½ä¸éè¦è·å表级å«ç AUTO_INCREMENT éï¼
妿binlog_format为statement模å¼ï¼å¦æä»æå¡å¨ä¸ç计æ°å¨çå¼å¯è½ä¼ä¸ä¸»æå¡å¨ä¸ä¸è´ï¼
å¯è½ä¼æåä¸è¡æ°æ®å¨ä¸»ä»æ°æ®åºä¸idä¸ä¸æ ·çæ
åµï¼å¦æbinlog_format为row模å¼ï¼é£ä¹å°±ä¸å½±åã
##### æåé
æåéå®ç主è¦ç®çæ¯è¡¨ææäººæ£å¨éå®è¡¨ä¸çè¡ï¼æè
æç®éå®è¡¨ä¸çè¡ï¼è¿æ ·åå 表级å«çææ¥éXï¼å
±äº«éSæ¶ï¼é¿å
äºå»æ¥è¯¢æ¯ä¸è¡æ°æ®ï¼å¤ææ¯å¦å äºè¡éï¼åå°äºæ§è½å¼éã
**æåå
±äº«éï¼ISéï¼**
äºå¡è®©ä¸è¡æ°æ®åªè½è¯»ï¼éè¦ç³è¯·å¯¹è¿è¡æ°æ®å è¡çº§å«çéå
±äº«éSï¼å¨ç³è¯·Séä¹åä¼ä¸»å¨ç³è¯·è¡¨çº§å«çå
±äº«æåéISéã
**æåææ¥é(IXé)**
äºå¡å¨æ´æ°æä¸è¡æ°æ®æ¶ï¼éè¦ç³è¯·å¯¹è¿è¡æ°æ®å è¡çº§å«çéææ¥éXï¼å¨ç³è¯·Xéä¹åä¼ç³è¯·IX
æåéä¹é´æ¯å
¼å®¹çï¼ISéåIXæ¯å
¼å®¹ï¼å 为å¯è½æä»¬å¯¹ç¬¬ä¸è¡æ°æ®å Séï¼é£ä¹ä¼ç³è¯·ISéï¼å¯¹ç¬¬äºè¡æ°æ®å Xéï¼æ¤æ¶è·ç¬¬ä¸è¡çæ°æ®çSéä¸å²çªï¼æä»¥ä¹ä¼å
ç³è¯·IXéï¼ç±æ¤å¯è§ï¼ISéåIXä¹é´ä¸å²çªï¼ISéï¼IXéä¸è¡çº§å«çSï¼è¡çº§å«çXä¹é´ä¹ä¸å²çªã
æåéåªæ¯è·è¡¨çº§å«çSï¼Xéå¯è½ä¼å²çªã
| | 表级å«çSé | 表级å«çXé |
| ---- | ----------- | ----------- |
| IS | å
¼å®¹ | ä¸å
¼å®¹ |
| IX | ä¸å
¼å®¹ | ä¸å
¼å®¹ |
##### é£ä¹æåéçä½ç¨æ¯ä»ä¹å¢ï¼
å妿²¡ææåéï¼æä»¬æ§è¡lock table readå½ä»¤æ¥ç³è¯·è¡¨éï¼è®©æ´ä¸ªè¡¨åªè½è¯»ï¼å¨è·å¾è¡¨çº§å«çåªè¯»éä¹åï¼éè¦æ§è¡çæ¥éª¤æ¯ï¼
1.æ°æ®åºä¼å
夿å½å表æ¯å¦å äºææ¥éï¼å 为è¿ä¸ªæ¶åè¦æ¯å äºææ¥éï¼æ¯åªè½ç±å äºé£ä¸ªææ¥éçäºå¡æ¥æ´æ°æ°æ®ï¼å
¶ä»äºå¡é½ä¸è½è¯»æ°æ®ï¼åªè½é»å¡çå¾
ã
2.妿å½å表没æå ææ¥éï¼é£ä¹å°±éè¦å¯¹æ¯ä¸è¡æ°æ®è¿è¡å¤æï¼å¤ææ¯å¦å äºè¡çº§å«çXéï¼å¦æå äºåªè½é»å¡çå¾
ï¼è¿æ ·éè¦å¯¹ä¸è¡è¿è¡å¤æï¼æ§è½å¼é太大äºã
æä»¥ææäºæåéï¼å¨è·å¾è¡¨çº§å«çåªè¯»éä¹åï¼éè¦æ§è¡çæ¥éª¤æ¯ï¼
1.ç¬¬ä¸æ¥è¿æ¯è·ä¸é¢çæ¥éª¤ä¸ä¸æ ·
2.ç¬¬äºæ¥åªéè¦å¤æå½å鿝å¦å äºè¡¨çº§å«çæåææ¥éï¼å ä¸ºå¦æå äºæåææ¥éï¼è¯´ææ£å¨æäºå¡å¨å¯¹æ°æ®å è¡éï¼å¯¹æ°æ®è¿è¡æ´æ°ï¼è¿æ ·é¿å
äºå¯¹æ¯ä¸è¡æ°æ®è¿è¡å¤æï¼å¤ææ¯å¦å äºè¡éã
####Innodbçé
##### è¡é
* å
±äº«é Séï¼å°±æ¯è¯»éï¼å
许äºå¡è¯»ä¸è¡æ°æ®ï¼ä¸è½è¢«ä¿®æ¹ãæä»¥è¯»éä¹é´ä¸ææ¥
* äºæ¥é Xéï¼å°±æ¯åéï¼å°±æ¯è®©å½åäºå¡å¯ä»¥ä¿®æ¹è¿è¡æ°æ®ï¼å
¶ä»äºå¡ä¸è½ä¿®æ¹è¿è¡æ°æ®
##### è®°å½é record lock
è®°å½é宿¯å¯¹åæ¡ç´¢å¼è®°å½çéå®ãä¾å¦ï¼ `SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE;` å¯ä»¥é²æ¢ä»æå
¥ï¼æ´æ°æå é¤è¡ã
##### é´éé gap lock
é´ééå°±ä¼å¯¹è®°å½ä¹é´çé´éå éï¼é²æ¢æ°æ®æå
¥ãå°±æ¯æä»¬å¨ä½¿ç¨å®æ¶è¯»(SELECT FOR ⦠UPDATE)æè
æ´æ°ï¼ä¸ºäºé²æ¢è¯»çè¿ç¨ä¸ææ°çæ°æ®æå
¥ï¼ä¼å¯¹æä»¬è¯»çæ°æ®çå·¦å³åºé´è¿è¡å éï¼é²æ¢å
¶ä»äºå¡æå
¥æ°æ®ï¼æä»¥é´ééä¹é´æ¯ä¸ææ¥çï¼é´ééææ¥çåªæ¯æå
¥æ°æ®çæä½ã
##### ä¸ä¸é®é next-key lock
next-key lockå°±æ¯ä¼éè®°å½ä»¥åè®°å½ä¹é´çé´éï¼å°±æ¯ record lock å gap lockçç»åï¼å°±æ¯ä¼å¯¹ç´¢å¼è®°å½å è®°å½é + ç´¢å¼è®°å½åé¢é´éä¸çéâï¼å°±æ¯å¯¹è¦æ´æ°çæ°æ®çå·¦å³ä¸¤ä¸ªç«¯ç¹å é´ééï¼
ä¾å¦numæ¯ä¸ä¸ªæ®éç´¢å¼ï¼éå¯ä¸æ§ç´¢å¼ï¼å·²ææ°æ®æ¯1ï¼5ï¼10ï¼20ï¼30
é£ä¹ next-key lockå¯ä»¥éå®çåºé´æ¯
```
(è´æ ç©·,1]
(1,5]
(5,10]
(10,20]
(20,30]
(30,æ£æ ç©·)
```
```
//æ´æ°æä½
update table set note = '1' where num = 10;
//æè
æ¯ä½¿ç¨å®æ¶è¯»
SELECT * FROM table WHERE num = 10 for UPDATE;
```
妿numæ¯å¯ä¸æ§ç´¢å¼ï¼é£ä¹åªéè¦å¯¹num为10çè¿æ¡ç´¢å¼å éå°±è¡äºï¼å 为ä¸ç¨æ
å¿å
¶ä»äºå¡åæå
¥ä¸æ¡num为10çæ°æ®ï¼å ä¸ºä¼æå¯ä¸æ§å¤æã使¯å¦ænumæ¯éå¯ä¸æ§ç´¢å¼ï¼ä¸ºäºé²æ¢äºå¡æ§è¡è¿ç¨ä¸ænum为10çæ°æ®æå
¥ï¼é£ä¹ä¼å¯¹ï¼5ï¼10]åï¼10ï¼20]è¿ä¸¤ä¸ªåºé´å éã
### æ»éæ¯ä»ä¹ï¼
æ»éå°±æ¯ä¸¤ä¸ªæå¤ä¸ªäºå¡å¨åä¸èµæºä¸ç¸äºå ç¨ï¼å¹¶ä¸è¯·æ±å¯¹æ¹çå ç¨çèµæºãInnoDBç®åå¤çæ»éçæ¹æ³å°±æ¯å°æææå°è¡çº§æä»éçäºå¡è¿è¡åæ»ã
#### Bæ æ¯ä»ä¹ï¼

平衡äºåæ å°±æ¯æ¯ä¸ªèç¹å·¦å³åæ çé«åº¦å·®å°äºçäº1ï¼Bæ å
¶å®æ¯ä¸ä¸ªå¹³è¡¡å¤è·¯æ¥æ¾æ ï¼å设æ¯Mé¶çï¼
1.æ ¹èç¹è³å°æä¸ä¸ªå
³é®å
2.éæ ¹é页èç¹çå
³é®åæ°æ¯ éè¦<=m-1å¹¶ä¸>ceil(m/2)-1ï¼
3.èç¹å
çå
ç´ ä»å·¦å°å³éå¢ï¼å·¦è¾¹èç¹çææå
ç´ å¼<å³è¾¹èç¹çææå
ç´ å¼
4.å¶åèç¹å¨åä¸å±ï¼é«åº¦ä¸è´ã
è·äºåæ ç¸æ¯ï¼å 为æ¯ä¸ªèç¹å
³é®åä¼å¤å¾å¤ï¼æä»¥ç¸åçå
³é®åæ°æ¶ï¼å±çº§ä¼å°å¾å¤ï¼ä¼åå°æ¥æ¾æ¶é´åå¤æåº¦ã
https://segmentfault.com/a/1190000020416577
https://blog.csdn.net/chai471793/article/details/99563704

### Bæ ä¸B+æ çåºå«æ¯ä»ä¹ï¼
1.Bæ æ¯ä¸ªèç¹ä¼ä¿åå
³é®åï¼ç´¢å¼åæ°æ®ãèB+æ åªæå¶åèç¹ä¿åæ°æ®ï¼å
¶ä»èç¹åªä¿åå
³é®ååç´¢å¼ãæä»¥ç¸åçå
å空é´å¯ä»¥å®¹çº³æ´å¤çèç¹å
ç´ ã
2.B+æ çæææ°æ®é½åå¨å¶åèç¹ä¸ï¼æä»¥æ¥è¯¢ä¼æ´å 稳å®ï¼èä¸ç¸é»çå¶åèç¹é½æ¯è¿æ¥å¨ä¸èµ·çï¼æ´å éååºé´æ¥æ¾åæç´¢ï¼
##### B+æ ä¸äºåæ åºå«ï¼ä¼ç¹ï¼ä¸ºä»ä¹ä¸ç¨çº¢é»æ ï¼
çº¢é»æ æ¯ä¸ä¸ªå¹³è¡¡çäºåæ¥æ¾æ ãå³ä¾¿å¨æåçæ
åµä¸ï¼çº¢é»æ è½å¤ä»¥O(log(N))çæ¶é´å¤æåº¦è¿è¡æç´¢ãæå
¥ãå 餿ä½ï¼
##### ä¸çº¢é»æ çæ¯è¾
çº¢é»æ ç平衡æ ä¹å¯ä»¥ç¨æ¥å®ç°ç´¢å¼ï¼ä½æ¯æä»¶ç³»ç»åæ°æ®åºç³»ç»æ®ééç¨ B+ Tree ä½ä¸ºç´¢å¼ç»æï¼ä¸»è¦æä»¥ä¸ä¸¤ä¸ªåå ï¼
ï¼ä¸ï¼æ´å°çæ¥æ¾æ¬¡æ°
å¹³è¡¡æ æ¥æ¾æä½çæ¶é´å¤æåº¦åæ é« h ç¸å
³ï¼O(h)=O(logdN)ï¼å
¶ä¸ d 为æ¯ä¸ªèç¹çåºåº¦ã
çº¢é»æ çåºåº¦ä¸º 2ï¼è B+ Tree çåºåº¦ä¸è¬é½éå¸¸å¤§ï¼æä»¥çº¢é»æ çæ é« h å¾ææ¾æ¯ B+ Tree 大é常å¤ï¼æ¥æ¾ç次æ°ä¹å°±æ´å¤ã
ï¼äºï¼å©ç¨ç£çé¢è¯»ç¹æ§
为äºåå°ç£ç I/O æä½ï¼ç£çå¾å¾ä¸æ¯ä¸¥æ ¼æé读åï¼èæ¯æ¯æ¬¡é½ä¼é¢è¯»ãèB+æ°ä¸åå¨çå¶åèç¹å¨å
å䏿¯ç¸é»çï¼è¿æ ·å¯ä»¥è¯»åä¼å¿«ä¸äºã
### ç´¢å¼æ¯ä»ä¹ï¼
ç´¢å¼å¯ä»¥è®©æå¡å¨å¿«éå®ä½å°è¡¨çæå®ä½ç½®
ä¼ç¹æ¯
1.大大åå°äºæå¡å¨éè¦æ«æçæ°æ®éã
2.叮婿å¡å¨é¿å
æåºå¸¦æ¥çæ§è½å¼éã
3.å°éæºIOåæé¡ºåºIOã
### å符串索å¼åæ°åç±»åç´¢å¼çåºå«ï¼
å 为å符串索å¼å¨ç´¢å¼æ ä¸ä¸¤ä¸ªèç¹æ¯è¾ä¼æ¯è¾æ
¢ï¼æ°åç±»åçç´¢å¼ä¼å¿«ä¸äºï¼
妿éè¦ç¨å符串索å¼å¯ä»¥éç¨ä»¥ä¸è§£å³æ¹æ³ã
1.对å符串çån个å符建ç«åç¼ç´¢å¼ï¼åç¼ç´¢å¼ä¸è½ä½¿ç¨order byã
2.å¢å ä¸åï¼å¯¹å符串转æ¢ä¸ºæ´åçhashå¼address_key=hashToInt(address)ï¼å¯¹address_key建ç«ç´¢å¼ï¼æ¥è¯¢æ¶åæ¶éå®hashå¼ä¹éå®å°åãå¯ä»¥ç¨å¦ä¸æ¥è¯¢where address_key = hashToInt(âbeijing,chinaâ) and address = âbeijing,chinaâ;
æççè¯ï¼100ä¸çæ°æ®éï¼åç¬¦ä¸²ç´¢å¼æ¥è¯¢600msï¼æ°åæ¥è¯¢20msã
### unionåunionallçåºå«æ¯ä»ä¹ï¼
unionå°±æ¯å°ä¸¤ä¸ªSELECTè¯å¥æ¥è¯¢çç»æéåå¹¶(两个SELECTå¯ä»¥æ¯åä¸ä¸ªè¡¨ï¼ä¹å¯ä»¥æ¯ä¸å表)ï¼å¦æéè¦æåºï¼å¨ç¬¬äºä¸ªSELECTè¯å¥åå ORDER BYè¯å¥ï¼ä¼å¯¹ææç»æè¿è¡æåºã
unioné»è®¤æ¯ä¼å»é¤éå¤çæ°æ®çï¼ä¼å¯¹ç»æéåå»éå¤çï¼union allä¸ä¼åå»éå¤çã
æä»¥unionæçæ
¢ä¸äºï¼å¦æè½ç¡®å®ç»æä¸ä¼é夿è
éè¦ä¸å»éçç»æï¼é£ä¹åºè¯¥ä½¿ç¨union allï¼æçä¼é«ä¸äºã

### Joinç工使µç¨æ¯æä¹æ ·çï¼æä¹è¿è¡ä¼åï¼
##### joinç大æ¦ä½¿ç¨æ¯æä¹æ ·çï¼
full outer join ä¼å
å«ä¸¤ä¸ªè¡¨ä¸æ»¡è¶³æ¡ä»¶çè¡
left outer join ä¼å
å«å·¦è¾¹çè¡¨ä¸æ»¡è¶³æ¡ä»¶çè¡
right outer join ä¼å
å«å³è¾¹çè¡¨ä¸æ»¡è¶³æ¡ä»¶çè¡
inner join å°±æ¯åªå
嫿»¡è¶³æ¡ä»¶çè¡
cross join ä»è¡¨A循ç¯ååºæ¯ä¸æ¡è®°å½å»è¡¨Bå¹é
ï¼cross join åé¢ä¸è½è·onï¼åªè½è·where
##### 工使µç¨
å¨ä½¿ç¨joinæ¶ï¼é»è®¤ä¼éæ©æ»¡è¶³æ¡ä»¶çè¡æ°å°ç表ä½ä¸ºé©±å¨è¡¨ï¼ç¶åå°å®ä½ä¸ºå¤å±å¾ªç¯ï¼å驱å¨è¡¨çç»æéä¸çæ¯ä¸è¡æ°æ®å»ä¸ä¸ä¸ªè¡¨ä¸æ¥è¯¢ç¬¦å·æ¡ä»¶çæ°æ®ï¼ç¶ååå¹¶ç»æï¼å¾å°ç»æéï¼å¦æè¿æç¬¬ä¸ä¸ªè¡¨ï¼é£ä¹ç»§ç»å°ç»æéä¸çæ¯ä¸è¡å»ç¬¬ä¸ä¸ªè¡¨ä¸æ¥è¯¢ç¬¦å·æ¡ä»¶çæ°æ®ã
å¨è¿è¡å¤è¡¨æ¥è¯¢æ¶ï¼
* å¦ææ²¡æä½¿ç¨joinï¼é£ä¹é»è®¤éæ©æ»¡è¶³æ¡ä»¶çè¡æ°å°ç表ä½ä¸ºé©±å¨è¡¨ã
* å¦æä½¿ç¨äºjoinï¼å¦ææ¯left joinï¼é£ä¹å·¦è¾¹ç表ä½ä¸ºé©±å¨è¡¨ï¼å¦ææ¯right joinï¼é£ä¹å³è¾¹ç表ä½ä¸ºé©±å¨è¡¨ï¼å¦å¨é»è®¤æ»¡è¶³æ¡ä»¶çè¡æ°å°ç表ä½ä¸ºé©±å¨è¡¨ã
##### 1.æåºæ¶å°½é使ç¨é©±å¨è¡¨ä¸çåæ®µ
å ä¸ºå¦æä½¿ç¨çæ¯é驱å¨è¡¨ä¸çåæ®µä¼å¯¹é驱å¨è¡¨ï¼çåæ®µæåºï¼éè¦å¯¹å¾ªç¯æ¥è¯¢çåå¹¶ç»æï¼ä¸´æ¶è¡¨ï¼è¿è¡æåºï¼æ¯è¾èæ¶ï¼ä½¿ç¨Explainæ¶ä¼åç°åºç°Using temporaryã
##### 2.廿joinï¼ç´æ¥è¿è¡å¤è¡¨æ¥è¯¢
æ¤æ¶MySQLä¼èªå·±éæ©å°è¡¨ä½ä¸ºé©±å¨è¡¨ï¼åå°æ¥è¯¢èæ¶ã
##### 3.å¢å¤§join_buffer_sizeçå¼
##### Index Nested-Loop Join
å°±æ¯æ¥è¯¢æ¶ï¼è¢«é©±å¨è¡¨ä¸çç´¢å¼å¯ä»¥ä½¿ç¨ï¼è¿æ ·é©±å¨è¡¨ä½ä¸ºå¤å±å¾ªç¯ï¼å¯¹é©±å¨è¡¨ç»æééåæ¶ï¼æ¯æ¬¡å»è¢«é©±å¨è¡¨æ¥è¯¢æ¶å¯ä»¥ä½¿ç¨ç´¢å¼ã
##### Block Nested-Loop Join
å°±æ¯æ¥è¯¢æ¶ï¼æ¯æ¬¡å¯ä»¥å°é©±å¨è¡¨çä¸é¨åå è½½å°å
åç¼å²åºä¸join_bufferä¸å»ï¼è¿æ ·æ¯æ¬¡å¯¹è¢«é©±å¨è¡¨è¿è¡éåï¼æ¯æ¬¡åä¸ä¸ªå
ç´ ä¸join_bufferä¸çå
ç´ è¿è¡å¯¹æ¯ï¼è¿æ ·è¢«é©±å¨è¡¨çé忬¡æ°å°±çäº è¢«é©±å¨è¡¨çè¡æ°*(驱å¨è¡¨çè¡/æ¯æ¬¡è½å å°join_bufferä¸çè¡æ°)ï¼è¿æ ·join_bufferè¶å¤§ï¼è¢«é©±å¨è¡¨è¢«æ«æç次æ°å°±è¶å°ï¼æä»¥å¯ä»¥å¢å¤§join_bufferç大å°ã
(join_bufferç大尿¯ç±åæ°join_buffer_size设å®çï¼é»è®¤å¼æ¯256k)
##### exits åinï¼joinçåºå«æ¯ä»ä¹ï¼
existsæ¯æ¿å¤è¡¨çæ°æ®å循ç¯ï¼æ¯æ¬¡å¾ªç¯å»å
è¡¨ä¸æ¥è¯¢æ°æ®ï¼ä½¿ç¨éå
表æ¯è¾å¤§çæ
åµ
è inçè¯æ£å¥½ç¸åï¼æ¯é£å
è¡¨çæ°æ®å循ç¯ï¼æ¯æ¬¡å¾ªç¯å»å¤è¡¨æ¥è¯¢æ°æ®ï¼éåå
表æ¯è¾å°çæ
åµã
```
select * from A where cc in (select cc from B)
-- æçä½ï¼ç¨å°äºA表ä¸ccåçç´¢å¼ï¼
select * from A where exists(select cc from B where cc=A.cc)
-- æçé«ï¼ç¨å°äºB表ä¸ccåçç´¢å¼ã
```
not in ånot exists妿æ¥è¯¢è¯å¥ä½¿ç¨äºnot in é£ä¹å
å¤è¡¨é½è¿è¡å
¨è¡¨æ«æï¼æ²¡æç¨å°ç´¢å¼ï¼ènot extsts çåæ¥è¯¢ä¾ç¶è½ç¨å°è¡¨ä¸çç´¢å¼ãæä»¥æ 论é£ä¸ªè¡¨å¤§ï¼ç¨not exists齿¯not inè¦å¿«ã
joinçå®ç°å
¶å®æ¯å
ä»ä¸ä¸ªè¡¨ä¸æ¾åºææè¡ï¼æè
æ ¹æ®whereå奿¥åºç¬¦å·æ¡ä»¶çè¡)ï¼ç¶åå»ä¸ä¸ä¸ªè¡¨ä¸å¾ªç¯å¯»æ¾å¹é
çè¡ï¼ä¾æ¬¡ä¸å»ï¼ç´å°æ¾å°ææå¹é
çè¡ï¼ä½¿ç¨joinä¸ä¼å»å建临æ¶è¡¨ï¼ä½¿ç¨inçè¯ä¼å建临æ¶è¡¨ï¼éæ¯ä¸´æ¶è¡¨
æä»¥ä¸ç®¡æ¯inåæ¥è¯¢ï¼existsåæ¥è¯¢è¿æ¯joinè¿æ¥æ¥è¯¢ï¼åºå±çå®ç°åç齿¯ä¸æ ·çï¼æ¬è´¨ä¸æ¯æ²¡æä»»ä½åºå«çï¼å
³é®çç¹å¨å
³è表ç顺åºï¼å¦ææ¯joinè¿æ¥æ¥è¯¢ï¼MySQLä¼èªå¨è°æ´è¡¨ä¹é´çå
³è顺åºï¼éæ©æå¥½çä¸ç§å
³èæ¹å¼ãåä¸é¢inåexistsæ¯è¾çç»è®ºä¸æ ·ï¼å°è¡¨é©±å¨å¤§è¡¨ææ¯æä¼çéæ©æ¹å¼
### ä¸è®¾ç½®MySQL主é®ä¼æä¹æ ·ï¼
å¦ææ²¡æè®¾ç½®ä¸»é®ï¼innodbä¼éæ©ç¬¬ä¸ä¸ªé空å¯ä¸ç´¢å¼ä½ä¸ºèéç´¢å¼ã
å¦ææ²¡æè®¾ç½®ä¸»é®ï¼ä¹æ²¡æåéçå¯ä¸ç´¢å¼ï¼é£ä¹ä¼çæä¸ä¸ªéèçidä½ä¸ºç´¢å¼ç主é®ï¼è¿ä¸ªå¼ä¼éçæå
¥èèªå¢ã
主é®å¦ææ¯èªå¢çï¼é£ä¹æå
¥æ°æ®çä½ç½®æ¯å·²ç¥çï¼èä¸ä¸ç¨ç§»å¨å·²ææ°æ®ã妿æ¯éèªå¢çï¼é¦å
éè¦æ¥æ¾å°è¦æå
¥çä½ç½®ï¼è¿ä¼¼äºéæºæ¥æ¾ï¼ç¶åå°åé¢çæ°æ®ååç§»å¨ã
### èéç´¢å¼æ¯ä»ä¹ï¼
èéç´¢å¼ä¸éèéç´¢å¼çæä¸»è¦çåºå«æ¯ï¼å¶èç¹æ¯å¦åæ¾ä¸æ´è¡è®°å½
##### innodb
innodbçç´¢å¼æ¯èç°ç´¢å¼ï¼å°±æ¯æææ°æ®é½åå¨èéç´¢å¼ççå¶åèç¹ä¸ï¼å
¶ä»äºçº§ç´¢å¼ççå¶åèç¹å¼åå¨KEYåæ®µå 对åºåç主é®å¼ï¼å¦æä½¿ç¨äºçº§ç´¢å¼æ¥æ¾æ°æ®ï¼å
æ ¹æ®ç´¢å¼æ¥å°äºçº§ç´¢å¼å¯¹åºçè¡ç主é®idï¼ç¶åæ ¹æ®ä¸»é®idå»èéç´¢å¼ä¸æ¥æ¾å¯¹åºçè¡çæ°æ®ãï¼æä»¥innodbå¿
é¡»è¦æä¸»é®ï¼


1.对äº**èç°ç´¢å¼è¡¨**æ¥è¯´ï¼å·¦å¾ï¼ï¼è¡¨æ°æ®æ¯å主é®ä¸èµ·åå¨çï¼ä¸»é®ç´¢å¼çå¶ç»ç¹åå¨è¡æ°æ®(å
å«äºä¸»é®å¼)ï¼å
¶ä»åï¼äºå¡IDï¼åæ»æéï¼äºçº§ç´¢å¼çå¶ç»ç¹åå¨è¡ç主é®å¼ã使ç¨çæ¯B+æ ä½ä¸ºç´¢å¼çåå¨ç»æï¼éå¶åèç¹é½æ¯ç´¢å¼å
³é®åï¼ä½éå¶åèç¹ä¸çå
³é®åä¸ä¸åå¨å¯¹åºè®°å½çå
·ä½å
容æå
容å°åãå¶åèç¹ä¸çæ°æ®æ¯ä¸»é®ä¸å
·ä½è®°å½(æ°æ®å
容)ã
2.对äº**éèç°ç´¢å¼è¡¨**æ¥è¯´ï¼å³å¾ï¼ï¼è¡¨æ°æ®åç´¢å¼æ¯åæä¸¤é¨ååå¨çï¼ä¸»é®ç´¢å¼åäºçº§ç´¢å¼åå¨ä¸æ²¡æä»»ä½åºå«ã使ç¨çæ¯B+æ ä½ä¸ºç´¢å¼çåå¨ç»æï¼ææçèç¹é½æ¯ç´¢å¼ï¼å¶åèç¹åå¨çæ¯ç´¢å¼+æåç´¢å¼å¯¹åºçè®°å½çæ°æ®çæéã
##### èç°ç´¢å¼çä¼ç¹
1.å½ä½ éè¦ååºä¸å®èå´å
çæ°æ®æ¶ï¼ç¨èç°ç´¢å¼ä¹æ¯ç¨éèç°ç´¢å¼å¥½ã
2.å½éè¿èç°ç´¢å¼æ¥æ¾ç®æ æ°æ®æ¶çè®ºä¸æ¯éèç°ç´¢å¼è¦å¿«ï¼å 为éèç°ç´¢å¼å®ä½å°å¯¹åºä¸»é®æ¶è¿è¦å¤ä¸æ¬¡ç®æ è®°å½å¯»å,å³å¤ä¸æ¬¡I/Oã
3.使ç¨è¦çç´¢å¼æ«æçæ¥è¯¢å¯ä»¥ç´æ¥ä½¿ç¨é¡µèç¹ä¸ç主é®å¼ã
###### èç°ç´¢å¼ç缺ç¹
1.**æå
¥é度严éä¾èµäºæå
¥é¡ºåº**ï¼æç
§ä¸»é®çé¡ºåºæå
¥æ¯æå¿«çæ¹å¼ï¼å¦åå°ä¼åºç°é¡µåè£ï¼ä¸¥é影忧è½ãå æ¤ï¼å¯¹äºInnoDBè¡¨ï¼æä»¬ä¸è¬é½ä¼å®ä¹ä¸ä¸ªèªå¢çIDå为主é®ã
2.**æ´æ°ä¸»é®ç代价å¾é«ï¼å 为å°ä¼å¯¼è´è¢«æ´æ°çè¡ç§»å¨**ãå æ¤ï¼å¯¹äºInnoDBè¡¨ï¼æä»¬ä¸è¬å®ä¹ä¸»é®ä¸ºä¸å¯æ´æ°ã
3.**äºçº§ç´¢å¼è®¿é®éè¦ä¸¤æ¬¡ç´¢å¼æ¥æ¾ï¼ç¬¬ä¸æ¬¡æ¾å°ä¸»é®å¼ï¼ç¬¬äºæ¬¡æ ¹æ®ä¸»é®å¼æ¾å°è¡æ°æ®ã**
äºçº§ç´¢å¼çå¶èç¹åå¨çæ¯ä¸»é®å¼ï¼è䏿¯è¡æéï¼éèç°ç´¢å¼åå¨çæ¯æéæè
说æ¯å°åï¼ï¼è¿æ¯ä¸ºäºåå°å½åºç°è¡ç§»å¨ææ°æ®é¡µåè£æ¶äºçº§ç´¢å¼çç»´æ¤å·¥ä½ï¼ä½ä¼è®©äºçº§ç´¢å¼å ç¨æ´å¤ç空é´ã
4.**éç¨èç°ç´¢å¼æå
¥æ°å¼æ¯éç¨éèç°ç´¢å¼æå
¥æ°å¼çéåº¦è¦æ
¢å¾å¤**ï¼å 为æå
¥è¦ä¿è¯ä¸»é®ä¸è½éå¤ï¼å¤æä¸»é®ä¸è½éå¤ï¼éç¨çæ¹å¼å¨ä¸åçç´¢å¼ä¸é¢ä¼æå¾å¤§çæ§è½å·®è·ï¼èç°ç´¢å¼éåææçå¶åèç¹ï¼éèç°ç´¢å¼ä¹å¤æææçå¶åèç¹ï¼ä½æ¯èç°ç´¢å¼çå¶åèç¹é¤äºå¸¦æä¸»é®è¿æè®°å½å¼ï¼è®°å½ç大å°å¾å¾æ¯ä¸»é®è¦å¤§çå¤ãè¿æ ·å°±ä¼å¯¼è´èç°ç´¢å¼å¨å¤å®æ°è®°å½æºå¸¦ç䏻鮿¯å¦é夿¶è¿è¡æè´µçI/O代价ã
### èåç´¢å¼æ¯ä»ä¹ï¼
èåç´¢å¼å°±æ¯å¤åç´¢å¼ï¼å°±æ¯å¯ä»¥å¤ä¸ªå段建ç«ä¸ä¸ªç´¢å¼ï¼å¹¶ä¸æ¯æå·¦åç¼å¹é
å
ç´ ï¼
```
create index a_b_c on user(a,b,c)
è¿æ ·ç¸å½äºæ¯å建ä¸ä¸ªç´¢å¼
a
a,b
a,b,c
```
å°±æ¯å¨éèç°ç´¢å¼å¯¹åºçB+æ ä¸ï¼ç´¢å¼çæåºæ¯å
æ¯è¾aç大å°ï¼åæ¯è¾bç大å°ç¶å忝è¾cç大å°ã并䏿¯éå°èå´æ¯è¾æ¶å°±ä¼åæ¢å¹é
ã
1. æå·¦åç¼å¹é
ååï¼MySQLä¼ä¸ç´åå³å¹é
ç´å°éå°èå´æ¥è¯¢ï¼>ã<ãbetweenãlikeï¼å°±åæ¢å¹é
ï¼æ¯å¦ a="3" and="" b="4" c="">5 and d=6,å¦æå»ºç«(a,b,c,d)顺åºçç´¢å¼ï¼dæ¯æ æ³ä½¿ç¨ç´¢å¼çï¼å¦æå»ºç«(a,b,d,c)çç´¢å¼åé½å¯ä»¥ä½¿ç¨å°ï¼aãbãdç顺åºå¯ä»¥ä»»æè°æ´ã
2. =åinå¯ä»¥ä¹±åºï¼æ¯å¦ a=1 and b=2 and c=3 建ç«(a,b,c)ç´¢å¼å¯ä»¥ä»»æé¡ºåºï¼MySQLçæ¥è¯¢ä¼åå¨ä¼å¸®ä½ ä¼åæç´¢å¼å¯ä»¥è¯å«çå½¢å¼ã
ä¾å¦ï¼
```
select * from user where a > 1;
SELECT * FROM user WHERE a='2222' OR b='13281899972'//è¿ä¸ªå°±ä¸ä¼èµ°èåç´¢å¼ï¼å ä¸ºåªæ¯æ¥è¯¢bæ¶ä¸è½æ ¹ç©¶ç´¢å¼æ¥è¯¢ï¼æä»¥è¿æ¯éè¦å
¨è¡¨æ«æï¼æä»¥å¹²èaä¹ä¸ç¨ç´¢å¼äºã
妿aï¼bé½æç´¢å¼ï¼é£ä¹ä¼åç¬æ ¹æ®aï¼bæ¥æ¥è¯¢ï¼ç¶åå°ç»æéåå¹¶
å
³äºoræ¥è¯¢ççç¸æ¯ï¼
æè°çç´¢å¼å¤±ææçæ¯ï¼åå¦orè¿æ¥ç俩个æ¥è¯¢æ¡ä»¶åæ®µä¸æä¸ä¸ªæ²¡æç´¢å¼çè¯,弿伿¾å¼ç´¢å¼è产çå
¨è¡¨æ«æã
```
è¿æ ·çè¯å¥å¯ä»¥èµ°èåç´¢å¼ï¼ä½æ¯ä¸ä¼èµ°èåç´¢å¼ï¼å 为符å·è¿ä¸ªèå´çæ°æ®å¾å¤ï¼æ¥åºä¹åï¼åªè½è·å¾è¿äºæ°æ®ç主é®ï¼è¿éè¦æ ¹æ®ä¸»é®å»èéç´¢å¼ä¸æ¥ï¼æçæ¯è¾ä½ï¼è¿ä¸å¦ç´æ¥å
¨é¨æ«æï¼æä»¥ç´æ¥å»èéç´¢å¼ä¸é¡ºåºå¾å¯¹å
¨è¡¨è¿è¡æ«æã
```
SELECT * FROM user WHERE age=1 and height = 2
SELECT * FROM user WHERE age=1 and weight=7
SELECT * FROM user WHERE weight=7 and age=1
```
è¿äºæ¯å¯ä»¥èµ°èåç´¢å¼çï¼
```
SELECT * FROM user WEHRE age=1 and height>2 and weight=7
```
è¿ä¸ªä¹ä¼èµ°èåç´¢å¼ï¼æ¥åºage=1çç´¢å¼ï¼ç¶åæ¥åºheight>2çæææ°æ®ï¼å 为heightæ¯ä¸ä¸ªèå´æ¥æ¾ï¼æä»¥å°weightå°±ä¸ä¼ç¨ç´¢å¼ï¼ä¼å°å°è¿äºæ°æ®è½½å
¥å
åï¼æ ¹æ®weightè¿è¡çéã
ç´¢å¼æ²¡æè¢«éç¨ï¼
1ãæ ¹æ®æç´¢æ¡ä»¶ï¼æ¾åºææå¯è½ä½¿ç¨çç´¢å¼
2ã计ç®å
¨è¡¨æ«æç代价
3ã计ç®ä½¿ç¨ä¸åç´¢å¼æ§è¡æ¥è¯¢ç代价
4ã对æ¯åç§æ§è¡æ¹æ¡çä»£ä»·ï¼æ¾åºææ¬æä½çé£ä¸ä¸ª ã
### è¦çç´¢å¼æ¯ä»ä¹ï¼
å°±æ¯å妿ä¸ä¸ªèåç´¢å¼(a,b,c)ï¼å¦ææä»¬åªæ¯éè¦a,b,cè¿å ä¸ªåæ®µçæ°æ®ï¼æ¥è¯¢æ¶å°±ä¸éè¦æ ¹æ®ä¸»é®idå»èéç´¢å¼éé¢å表æ¥è¯¢äº
```
SELECT a,b,c FROM user where a = 1
```
è¿ä¸ªå°±æ¯è¦çç´¢å¼ã
https://mp.weixin.qq.com/sï¼src=11×tamp=1586078743&ver=2260&signature=s1B5IvEAHXmba8XNgw2q4VXKTN8CpXfX1gjQA*Rcm1M4VpRlWzXAbExHcyLoI2hqJQWNSFZCJ3xdeZsRaph1ZpIAlYt-uTvlgX93gGXhKNiMTm1LCyGosANoDYRHe49N&new=1
åªäºæ
åµéè¦å»ºç´¢å¼ï¼
1. 主é®ï¼å¯ä¸ç´¢å¼
2. ç»å¸¸ç¨ä½æ¥è¯¢æ¡ä»¶çåæ®µéè¦å建索å¼
3. ç»å¸¸éè¦æåºãåç»åç»è®¡çåæ®µéè¦å»ºç«ç´¢å¼
4. æ¥è¯¢ä¸ä¸å
¶ä»è¡¨å
³èçåæ®µï¼å¤é®å
³ç³»å»ºç«ç´¢å¼
### åªäºæ
åµä¸è¦å»ºç´¢å¼ï¼
1. 表çè®°å½å¤ªå°ï¼ç¾ä¸çº§ä»¥ä¸çæ°æ®ä¸éè¦å建索å¼
2. ç»å¸¸å¢å æ¹ç表ä¸éè¦å建索å¼
3. æ°æ®éå¤ä¸åå¸å¹³åçåæ®µä¸éè¦å建索å¼ï¼å¦ true,false ä¹ç±»ã
4. é¢åæ´æ°çåæ®µä¸éåå建索å¼
5. whereæ¡ä»¶éç¨ä¸å°çåæ®µä¸éè¦å建索å¼
### 主é®ï¼å¯ä¸æ§ç´¢å¼ï¼æ®éç´¢å¼çåºå«æ¯ä»ä¹ï¼
ä¸ä¸ªè¡¨ä¸å¯ä»¥æå¤ä¸ªå¯ä¸æ§ç´¢å¼ï¼ä½åªè½æä¸ä¸ªä¸»é®ã
1.卿¥è¯¢æ¶ï¼å¦ææ¯ä½¿ç¨çæ¯ä¸»é®ï¼æè
æ¯å¯ä¸æ§ç´¢å¼æ¥è¯¢ï¼æ¥å°åå°±è¿åäºï¼æ®éç´¢å¼è¿ä¼ç»§ç»ååéåï¼ç´å°ç¬¬ä¸ä¸ªä¸æ»¡è¶³æ¡ä»¶çæä¼è¿åï¼æ®éç´¢å¼ä¼å¤æ£ç´¢å 次ãå 乿²¡æä»ä¹å½±åã
2.æ´æ°æ¶æ®éç´¢å¼éè¦å¤æå¯ä¸æ§ã
3.䏻鮿¯èéç´¢å¼ï¼æ®éæä»¥æ¯éèéç´¢å¼ã
### InnoDBåMyISAMçåºå«æ¯ä»ä¹ï¼
###### InnoDB
æ¯ MySQL é»è®¤çäºå¡ååå¨å¼æï¼åªæå¨éè¦å®ä¸æ¯æçç¹æ§æ¶ï¼æèè使ç¨å
¶å®åå¨å¼æã
å®ç°äºå个æ åçé离级å«ï¼é»è®¤çº§å«æ¯å¯éå¤è¯»ï¼REPEATABLE READï¼ãå¨å¯éå¤è¯»é离级å«ä¸ï¼éè¿å¤çæ¬å¹¶åæ§å¶ï¼MVCCï¼+ Next-Key Locking 鲿¢å¹»å½±è¯»ã
ä¸»ç´¢å¼æ¯èç°ç´¢å¼ï¼å¨ç´¢å¼ä¸ä¿åäºæ°æ®ï¼ä»èé¿å
ç´æ¥è¯»åç£çï¼å æ¤å¯¹æ¥è¯¢æ§è½æå¾å¤§çæåã
å
é¨åäºå¾å¤ä¼åï¼å
æ¬ä»ç£çè¯»åæ°æ®æ¶éç¨çå¯é¢æµæ§è¯»ãè½å¤å 快读æä½å¹¶ä¸èªå¨å建çèªéåºåå¸ç´¢å¼ãè½å¤å éæå
¥æä½çæå
¥ç¼å²åºçã
æ¯æçæ£çå¨çº¿çå¤ä»½ãå
¶å®åå¨å¼æä¸æ¯æå¨çº¿çå¤ä»½ï¼è¦è·åä¸è´æ§è§å¾éè¦åæ¢å¯¹ææè¡¨çåå
¥ï¼èå¨è¯»åæ··ååºæ¯ä¸ï¼åæ¢åå
¥å¯è½ä¹æå³çåæ¢è¯»åã
##### MyISAM
䏿¯æäºå¡ï¼ä¸æ¯æè¡çº§éï¼åªè½å
¨è¡¨å éï¼è¯»åæ¶ä¼å¯¹ææè¡¨å å
±äº«éï¼åå
¥æ¶ä¼å¯¹è¡¨å æä»éã
### ä»ä¹æ¯ååºå表ï¼
ä¸è¬è®¤ä¸ºåè¡¨æ°æ®éå¨1000䏿¶ï¼æ¥è¯¢æçæ¯æåéçï¼å¦æè¶
è¿1000ä¸ï¼æ§è¡æ§è½å°±ä¼ä¸éï¼å¯ä»¥èèååºå表
##### åç´åå
å°±æ¯æ ¹æ®åè¿è¡å表ï¼ä¾å¦æ ¹æ®ä¸å¡ï¼æ¥å¯¹è¡¨è¿è¡æåæä¸åçè¡¨ï¼æè
æ ¹æ®ä½¿ç¨é¢çï¼å°å¸¸ç¨çååå¨ä¸ä¸ªè¡¨éé¢ï¼å°ä¸å¸¸ç¨çååå¨ä¸ä¸ªè¡¨éé¢ã
##### æ°´å¹³åå
å°è¡¨æ ¹æ®è¡æ¥è¿è¡å表ï¼å°ä¸ä¸ªè¡¨æåæå¤ä¸ªè¡¨ç»æç¸åç表ã
第ä¸ç§ ä¸è¬æ¯ç¨ä¸»é®IDå¯¹æ°æ®è¡¨çæ°éè¿è¡å模è¿ç®ï¼å¾å°ç使°å°±æ¯æ°è¡¨çä½ç½®ãï¼å¦ææ¯å段æ¯å符串ï¼é£ä¹å°±æ ¹æ®å符串计ç®åºåå¸å¼ï¼ç¶åé¤ä»¥è¡¨çæ°éï¼å¾å°æ°åºçä½ç½®ï¼
第äºç§ æ ¹æ®æ¶é´æ¥æåï¼ä¸»è¡¨åªå卿è¿ä¸¤ä¸ªæçæ°æ®ï¼å¯è¡¨åå¨ä¹åçæ°æ®ãè¿ç§ä¸»è¦æ¯éååªç§è®¿é®çæ°æ®è·æ¶é´ç¸å
³æ§æ¯è¾å¤§çæ
åµï¼ä¾å¦ç»è®¡ï¼ææçæçç½ä»ä»¬çææ¯ææ¡£ï¼æç« PVï¼UVç»è®¡è¡¨ï¼å°±æ¯æ¯å¤©å¤§æ¦æ200ä¸çæç« æPVï¼UVï¼ä¹å°±æ¯æ°æ®åºæ¯å¤©ä¼æ°å¢200ä¸è¡çæ°æ®ï¼ä¸è¬æ¥è¯´æ¥æç« è¿æçUVï¼PVä¼å¤ä¸äºï¼æ¥æ¨æ¥PVï¼ä¸å¨PVï¼æè
ä¸ä¸ªæçPVä¼å¤ä¸äºãæä»¥æ¯å®è£
æ¶é´æ¥ååçåºåå·åºï¼ä¸æä¸ä¸ªè¡¨ï¼æè
ä¸å¤©ä¸è¡¨ã
é®é¢
äºå¡é®é¢ï¼å¦æå¨äºå¡é颿ä½ä¸ä¸ªè¡¨ï¼ç¶ååæä½å¦å¤ä¸ä¸ªè¡¨ï¼æç伿¯è¾ä½ï¼ç¶å乿¯è¾éº»ç¦ã
join
è·¨åºjoinçé®é¢
卿åä¹åï¼ç³»ç»ä¸å¾å¤å表å详æ
页æéçæ°æ®æ¯å¯ä»¥éè¿sql joinæ¥å®æçãèæååï¼æ°æ®åºå¯è½æ¯åå¸å¼å¨ä¸åå®ä¾åä¸åç主æºä¸ï¼joinå°åå¾é常麻ç¦ãèä¸åºäºæ¶æè§èï¼æ§è½ï¼å®å
¨æ§çæ¹é¢èèï¼ä¸è¬æ¯ç¦æ¢è·¨åºjoinçãé£è¯¥æä¹åå¢ï¼é¦å
è¦èèä¸åç´ååºç设计é®é¢ï¼å¦æå¯ä»¥è°æ´ï¼é£å°±ä¼å
è°æ´ãï¼å°±æ¯å°½éä¸è¦å»ååºï¼å¦ææ æ³è°æ´çæ
åµï¼ä¸é¢æå ç§è§£å³æ¹æ¡ï¼
1. å
¨å±è¡¨
æè°å
¨å±è¡¨ï¼å°±æ¯æå¯è½ç³»ç»ä¸æææ¨¡åé½å¯è½ä¼ä¾èµå°çä¸äºè¡¨ãæ¯è¾ç±»ä¼¼æä»¬çè§£çâæ°æ®åå
¸âã为äºé¿å
è·¨åºjoinæ¥è¯¢ï¼æä»¬å¯ä»¥å°è¿ç±»è¡¨å¨å
¶ä»æ¯ä¸ªæ°æ®åºä¸åä¿åä¸ä»½ãåæ¶ï¼è¿ç±»æ°æ®é常ä¹å¾å°åçä¿®æ¹ï¼çè³å ä¹ä¸ä¼ï¼ï¼æä»¥ä¹ä¸ç¨å¤ªæ
å¿âä¸è´æ§âé®é¢ã
##### ååºå表å
·ä½å®æ½
1.åæºè¿ç§»æ³
2.è¿ç§»å岿°æ®ï¼æ°çæ´æ°åkafkaæ¶æ¯
å°±æ¯å¯¹updatet_timeå°äºæä¸ªæ¶é´ç¹çæ°æ®å
¨é¨æ·è´åºæ¥ï¼è¿ç§»å°æ°çæ°æ®åºï¼åæ¶é¡¹ç®å¨æ§è¡å¢å æ¹ç¸å
³çSQLæ¶ï¼åæ¶å¾Kafkaä¸åä¸ä»½ï¼è¿ç§»ç»æåï¼ç¨è®¢é
ç¨åºæ¶è´¹kafkaæ¶æ¯ï¼æ´æ°æ°åºï¼æ¶è´¹å®ä¹åï¼ç¶åæ ¡éªä¸è´æ§åæ°æ®åºã
缺ç¹å°±ç®ä¾µå
¥æ§å¤ªå¼ºäºï¼æææ´æ°æ°æ®åºçä¸å¡é¡¹ç®é½éè¦æ¹å¨ï¼ç¶åç»kafkaåæ¶æ¯ã
3.è¿ç§»å岿°æ®ï¼è®¢é
bin logæ¥åæ´æ°
è¿æ¯å
è¿ç§»æ°æ®ï¼è¿ç§»å®ä¹åç¨è®¢é
ç¨åºæ¶è´¹bin logæ¶æ¯ï¼æ´æ°æ°åºï¼æ¶è´¹å®ä¹åï¼ç¶åæ ¡éªä¸è´æ§ï¼åæ°æ®åºã
### æä¹éªæ°æ®ä¸è´æ§
è¿é大æ¦ä»ç»ä¸ä¸å§ï¼è¿ç¯çç¯å¹
太é¿äºï¼å¤§å®¶å¿éæåºå°±è¡ã
(1)å
éªæ°éæ¯å¦ä¸è´ï¼å ä¸ºéªæ°éæ¯è¾å¿«ã
è³äºéªå
·ä½çåæ®µï¼æä¸¤ç§æ¹æ³:
(2.1)æä¸ç§æ¹æ³æ¯ï¼åªéªå
³é®æ§çå ä¸ªåæ®µæ¯å¦ä¸è´ã
éæºåå°æ¹éæ°æ®ï¼ç¼ç 忝è¾ã
(2.2)è¿æä¸ç§æ¯ ï¼ä¸æ¬¡å50æ¡(ä¸ä¸å®50æ¡ï¼å
·ä½èªå·±å®ï¼æåªæ¯ä¸¾ä¾),ç¶ååæ¼åç¬¦ä¸²ä¸æ ·ï¼æ¼å¨ä¸èµ·ãç¨md5è¿è¡å å¯ï¼å¾å°ä¸ä¸²æ°å¼ãæ°åºä¸æ ·å¦æ³ç®å¶ï¼ä¹å¾å°ä¸ä¸²æ°å¼ï¼æ¯è¾ä¸¤ä¸²æ°å¼æ¯å¦ä¸è´ã妿ä¸è´ï¼ç»§ç»æ¯è¾ä¸50æ¡æ°æ®ã妿åç°ä¸ä¸è´ï¼ç¨äºåæ³ç¡®å®ä¸ä¸è´çæ°æ®å¨0-25æ¡ï¼è¿æ¯26æ¡-50æ¡ã以æ¤ç±»æ¨ï¼æ¾åºä¸ä¸è´çæ°æ®ï¼è¿è¡è®°å½å³å¯ã
### æä¹å®ç°è·¨åºå页æ¥è¯¢ï¼
##### å
¨å±è§éæ³
å°±æ¯ä¾å¦è¦æ¥è¯¢ç¬¬ä¸é¡µçæ°æ®ï¼é£ä¹ææ¯ä¸ªåºéé¢åä¸é¡µçæ°æ®é½æ¥è¯¢åºæ¥ï¼ç¶åæåºï¼
ä¼ç¹æ¯æ¯è¾åç¡®ï¼ä¹æ¯è¾ç®å
é®é¢å°±æ¯æ¯ä¸ªåºè¿åç页æ°å¾å¤ï¼ç½ç»ä¼ è¾éå¾å¤§ï¼è䏿¶å°æ°æ®åçéè¦äºæ¬¡æåºï¼æåºçæ§è½æ¶è乿¯è¾å¤§ã
```
è¦æ¥order by time offset offset_value limit numæ¶
对æ¯ä¸ªåºæ¥ order by time offset 0 limit offset_value + numç¶åè¿è¡æåº
```
##### æå¤§æ¶é´æ³
å°±æ¯ç¦æ¢è·³é¡µæ¥è¯¢ï¼å°±æ¯å¦æä¸å¡ä¸éè¦è·³é¡µæ¥è¯¢çè¯ï¼ä¸å¼å§æ¥ç¬¬ä¸é¡µçæ¶åï¼ä»æ¯ä¸ªåºåä¸é¡µæ°æ®åæ¥è¿è¡æåºåè¿åã
æ¥ç¬¬äºé¡µæ°æ®æ¶æ ¹æ®ç¬¬ä¸é¡µç»æä¸æå¤§çæ¶é´å»æ¯ä¸ªåºååä¸é¡µæ°æ®ï¼ç¶åè¿è¡æåºå¾å°ç¬¬äºé¡µæ°æ®ã
ä¼ç¹æ¯æ¯æ¯æ¬¡ç´æä¸é¡µï¼ä¼ è¾æ°æ®éå°ï¼æåºçæ°æ®éä¹å°ï¼
ç¼ºç¹æ¯ç±äºæ¥ç¬¬äºé¡µå以åç页æ°é½éè¦ç¥éä¸ä¸é¡µæå¤§æ¶é´ã
```
è¦æ¥order by time offset offset_value limit numæ¶
è·å¾ä¸ä¸é¡µçæå¤§æ¶é´
对æ¯ä¸ªåºæ¥ where time >lastTime order by time offset 0 limit numç¶åè¿è¡æåº
```
##### æ¯åºå¹³ååæ³
åè®¾æ°æ®åå¸è¶³å¤å¹³åï¼æ¯ä¸ªåºçæ°æ®åå¸é½æ¯å¹³åçï¼å设æå个åºï¼æ¥ç¬¬ä¸é¡µæ°æ®æ¶ï¼æ¯ä¸ªåºé½åå0.25é¡µæ°æ®ï¼ç¶ååå¹¶åè¿åï¼å第äºé¡µæ°æ®æ¶ï¼æ¯ä¸ªåºåé½å0.25页ã使¯è¿æ ·å徿¯ä¸åçæ°æ®
```
å°order by time offset X limit Yï¼æ¹åæorder by time offset X/N limit Y/N
```
##### äºæ¬¡æ¥è¯¢æ³
åå¦è¦åoffset Xåï¼Yä¸ªæ°æ®ï¼
1.å设æå个åºï¼éè¦å»æ¯ä¸ªåºæ¥offset X/4 åYä¸ªçæ°æ®ï¼ç¶åå¾å°åä¸ªç»æéä¸timeæå°å¼time_minï¼
2.ç¶å廿¯ä¸ªåºå»æ¥between time_minå°ä¹åæ¯ä¸ªåºçtime_maxçç»æéï¼
3.å 为ä¹åæ¯ä¸ªåºçtime_maxçoffset齿¯X/4+Yï¼æä»¥å¯ä»¥åæ¨åºtime_min卿¯ä¸ªåºéçoffsetï¼ç¶åå¾å°å
¨å±offsetï¼
4.ç¶åæ ¹æ®å
¨å±offsetå¯ä»¥è®¡ç®æä»¬æ³å°çoffset XåYä¸ªæ°æ®ï¼å°±æ¯ä»¥time_min为起ç¹å°è·ç¦»æä»¬offsetçå·®å¼ã
å
³é®å¨äºç¬¬äºæ¥ï¼å¦ææ°æ®åºå é¤è¿æ°æ®ï¼time_minå°time_maxä¹é´å é¤è¿æ°æ®ï¼è¿æ ·å°±ä¸åï¼
```
ï¼1ï¼å°order by time offset X limit Yï¼æ¹åæorder by time offset X/N limit Y
ï¼2ï¼æ¾å°æå°å¼time_min
ï¼3ï¼betweenäºæ¬¡æ¥è¯¢ï¼order by time between time_min and time_i_max
ï¼4ï¼è®¾ç½®èætime_minï¼æ¾å°time_minå¨å个ååºçoffsetï¼ä»èå¾å°time_minå¨å
¨å±çoffset
ï¼5ï¼å¾å°äºtime_minå¨å
¨å±çoffsetï¼èªç¶å¾å°äºå
¨å±çoffset X limit Y
```
é¦å
éè¦æ¥è¯¢ä¸¤æ¬¡ï¼èä¸å¦æè¡¨æ°æ®æ¯æç
§åæ®µæ¥æ¥è¯¢çï¼ä¼æé®é¢ã
### MySQL主ä»å¤å¶ç工使µç¨æ¯ä»ä¹æ ·çï¼
å°±æ¯å°ä¸»èç¹çæ°æ®å¤å¶å°ä»èç¹ã
ç¨éï¼
1.å¯ä»¥è¯»åå离ï¼ä¸»åºç¨æ¥åæ°æ®ï¼ä»åºç¨æ¥è¯»æ°æ®ã卿´æ°æ°æ®æ¶ï¼ä¼å¯¹æ´ä¸ªè¡¨å éï¼å¦ææ¯è¯»åå离çï¼å¯ä»¥å»ä»è¡¨è¯»åæ°æ®ï¼è¿æ ·å°±ä¸ä¼æé®é¢ã
2.åå¤ä»½ï¼ä¸»åºåºæ
éåï¼è¿è¡æ
é转移ï¼è®©ä»åºä»£æ¿ä¸»åºï¼æä¾æå¡ã
##### å®ç°åç
主èç¹æ¥å¿åé线ç¨
å½ä¸»èç¹åä»èç¹å»ºç«è¿æ¥åï¼ä¸»æå¡å¨ä¸ä¼èµ·ä¸ä¸ªbin log dump线ç¨ï¼ç¨äºç»ä»èç¹åébin logæ¥å¿(æ¥å¿æå
å«çä¿¡æ¯ä¹å¤ï¼è¿å
æ¬æ¬æ¬¡è¿åçä¿¡æ¯çbin-log file ç以åbin-log position)ï¼å¨è¯»åbin logæ¥å¿æ¶ï¼ä¼å¯¹æ¥å¿æä»¶å éï¼è¯»å宿åä¼è§£éã
ä»èç¹I/O线ç¨
ä»èç¹ä¸ä¸»èç¹å»ºç«è¿æ¥åä¼èµ·ä¸ä¸ªI/Oçº¿ç¨æ¥æ¥å主èç¹åéè¿æ¥çbin logæ¥å¿å
容ï¼å¹¶ä¸ä¿åå¨ä»èç¹çrelay logæä»¶ä¸ã
ä»èç¹SQL线ç¨
ä»èç¹åæ¶ä¼èµ·ä¸ä¸ªSQL线ç¨ï¼æ¥è¯»å relay log ä¸çå
容ï¼è§£ææSQLï¼å¹¶ä¸å¨ä»èç¹ä¸æ§è¡ï¼ä¿è¯å主èç¹çæ°æ®ä¸è´æ§ã


å¤å¶æ¨¡å¼
##### 弿¥æ¨¡å¼ï¼é»è®¤ç模å¼ï¼
主èç¹ä¸ä¼ä¸»å¨push bin logç»ä»èç¹ï¼ä¹ä¸ä¼ç®¡ä»èç¹ç忥æ
åµï¼é»è®¤å°±æ¯è¿ç§æ¨¡å¼ã
##### ååæ¥æ¨¡å¼ï¼MySQL 5.5ä¹åæä¾ï¼
主èç¹ç»ä»èç¹åébin log ä¹åï¼ä¼ä¸ç´çå¾
ååºï¼åªè¦ä¸ä¸ªä»èç¹æ¥åbin logï¼å¹¶ä¸åå
¥relay log æåï¼ç»ä¸»èç¹è¿åæ¥åæåçACKä¿¡æ¯ï¼ä¸»èç¹å°±è®¤ä¸ºæåï¼æäº¤äºå¡ã
##### å
¨åæ¥æ¨¡å¼
å°±æ¯éè¦ææçä»èç¹æ¥åæ¥å¿ï¼å¹¶ä¸åå
¥relay log æåï¼ç»ä¸»èç¹è¿åæ¥åæåçACKä¿¡æ¯ï¼ä¸»èç¹æè®¤ä¸ºæåï¼æäº¤äºå¡ã
bin logæ ¼å¼
Statement-base Replication (SBR)è¯å¥æ¨¡å¼
å°±æ¯æ§è¡ä»ä¹æ´æ°çSQLï¼å°±å°è¿äºSQLä¿åå° bin logæ¥å¿æä»¶ä¸ã
缺ç¹å¨äºå¯è½æäºæ
åµä¸å¯¼è´æ°æ®ä¸ä¸è´ï¼ä¾å¦æ ¹æ®now()å½åæå¡å¨çæ¶é´ï¼å¯è½ä»èç¹æ§è¡è¯å¥æ¶çæ¶é´è·ä¸»èç¹çè¯å¥æ¶é´ä¸ä¸æ ·ã
Row-based Relication(RBR) æ°æ®è¡æ¨¡å¼
å°±æ¯æ´æ°é£äºæ°æ®è¡ï¼å°è¿äºæ´æ°çæ°æ®è¡çæSQLï¼ä¿åå¨bin logæ¥å¿æä»¶ä¸ã
ä¼ç¹æ¯è½ç¡®ä¿æ°æ®çç²¾åï¼ç¼ºç¹æ¯ä¼äº§ç大éçæ¥å¿ï¼æ¥å¿å
容ä¼å大ï¼å°¤å
¶æ¯ä¸è¡SQL坹大鿰æ®è¡æ´æ°æ¶ï¼èä¸ä¹ä¸è½éè¿bin logè§£æå½æ¶æ§è¡çSQLè¯å¥ã
Mixed-format Replication(MBR)ï¼MySQL NDB cluster 7.3 å7.4 使ç¨çMBRãæ¯ä»¥ä¸ä¸¤ç§æ¨¡å¼çæ··åï¼å¯¹äºä¸è¬çå¤å¶ä½¿ç¨STATEMENT模å¼ä¿åå°binlogï¼å¯¹äºSTATEMENTæ¨¡å¼æ æ³å¤å¶çæä½å使ç¨ROWæ¨¡å¼æ¥ä¿åï¼MySQL伿 ¹æ®æ§è¡çSQLè¯å¥éæ©æ¥å¿ä¿åæ¹å¼

#### æ»é
é¤äºåæ¡æ´æ°è¯å¥å¤ï¼äºå¡è·åè¡é齿¯éæ¥è·åçï¼æä»¥æå¯è½ä¼é ææ»éã
è§£å³æ»éæä¸¤ç§çç¥ï¼
1.è¶
æ¶æ¾å¼çå¾
innodb_lock_wait_timeout,é»è®¤æ¯50s,è¶
æ¶ä¼æ¥é
2.æ»éæ£æµ
innodb伿æ»éæ£æµï¼ä½æ¯ä¼æ¶èä¸äºcpuèµæºï¼æ£æµå°æ»éä¼è®©å æéæå°çäºå¡ä¼æ»ï¼éæ¾éã
3.æ§å¶å¹¶å度
å°±æ¯æ§å¶è®¿é®ç¸åèµæºçå¹¶åäºå¡éãä¾å¦å°é¿äºå¡æåæçäºå¡ï¼è¿æ ·æ¯æ¬¡äºå¡å ç¨æ¶é´ä¹å°ï¼ä¹å¯ä»¥åå°å
¶ä»äºå¡ççå¾
æ¶é´ã
### æä¹ä¼åæ°éæ¥è¯¢ï¼
å¨innodb弿ä¸ï¼
##### COUNT(*)åCount(id)
SELECT Count(\*)å
¶å®æ¯è·SELECT Count(id)æ¯çä»·çï¼ä¼å»ä¸»é®çèéç´¢å¼ä¸æ«ææ¯ä¸è¡ï¼ç¶åå¤æè¡æ¯å¦ä¸ºNullï¼ä¸ä¸ºNull计å
¥Countã
##### Count(col)
乿¯å
¨è¡¨æ«æï¼å¤æè¿ä¸è¡çcol弿¯å¦ä¸ºnullï¼ä¸ä¸ºnullï¼è®¡å
¥Count
æä¹ä¼åcount(\*)ï¼
å¯ä»¥ä½¿ç¨æ¥è¯¢ä¸ä¸ªé空çå¯ä¸ç´¢å¼é®çæ°éæ¥æ¿ä»£count(\*),å 为count(\*)éè¦éå主é®çèéç´¢å¼çå¶åèç¹ï¼è¯»åæ¯ä¸è¡çæ°æ®ï¼èCount(unique_key)ä¼å»unique_keyçç´¢å¼ä¸è¯»åæ¯ä¸ªå¶åçèç¹ï¼å 为æ¯ä¸ªå¶åèç¹åªå
å«unique_keyå主é®idï¼æ°æ®å¤§å°æ¯èéç´¢å¼ä¸çå¶åèç¹ä¸ï¼IOä¼å°ä¸äºã
##### Myisamå¯ä»¥ç¼åcountï¼èinnodbä¸è½ç¼åcount
å 为innodbæäºå¡çæ¦å¿µï¼å¦ææ¯å¨PRçé离级å«ä¸ï¼æ¯ä¸ªäºå¡æ¥è¯¢çcountåºè¯¥çäºäºå¡å¼å§æ¶count+æ¬äºå¡æ§è¡è¿ç¨ä¸å¯¹countçæ¹åï¼ä½æ¯ç±äºæ¯ä¸ªäºå¡å¯ä»¥åç¬è®¾ç½®ä¼è¯é离级å«ï¼æä»¥å¾é¾å®ç°å¯¹countçç¼åã
##### æä¹ä¼åæ
¢æ¥è¯¢ï¼
1.é¦å
æ ¹æ®explain+SELECTè¯å¥æ§è¡ï¼æ¥çç»æï¼
```
EXPLAIN SELECT * FROM res_user ORDER BYmodifiedtime LIMIT 0,1000
```
```
å¾å°å¦ä¸ç»æï¼
table | type | possible_keys | key |key_len | ref | rows | Extra EXPLAINåçè§£éï¼
- table æ¾ç¤ºè¿ä¸è¡çæ°æ®æ¯å
³äºåªå¼ 表ç
- type è¿æ¯éè¦çåï¼æ¾ç¤ºè¿æ¥ä½¿ç¨äºä½ç§ç±»åã仿好尿差çè¿æ¥ç±»å为constãeq_regãrefãrangeãindexheåALL
- rows æ¾ç¤ºéè¦æ«æè¡æ°
- key 使ç¨çç´¢å¼
constå°±æ¯é坹䏻鮿è
å¯ä¸æ§ç´¢å¼çç弿¥è¯¢ï¼éè¿ç´¢å¼æ¥æ¾ä¸æ¬¡å°±è¡äºãä»
ä»
æ¯æ¥ä¸æ¡æ°æ®ã
eq_ref å¯ä¸æ§ç´¢å¼é®æ«æï¼å¯¹äºæ¯ä¸ªç´¢å¼é®ï¼è¡¨ä¸åªæä¸æ¡æ°æ®ä¸å
¶å¯¹åºï¼ä¾å¦joinæ¥è¯¢æ¶ï¼å¯¹äºå表æ¥åºçç»æéï¼æ¯ä¸ªç»æå¨ç¬¬äºä¸ªè¡¨åªæä¸æ¡æ°æ®å¯¹åºã
ref éå¯ä¸æ§ç´¢å¼æ¥è¯¢
ref : æ¤ç±»åé常åºç°å¨å¤è¡¨ç join æ¥è¯¢, é对äºéå¯ä¸æé主é®ç´¢å¼, æè
æ¯ä½¿ç¨äº `æå·¦åç¼` è§åç´¢å¼çæ¥è¯¢. å
³é®å:éå¯ä¸æ§ç´¢å¼
ref_or_nullï¼ä¸refæ¹æ³ç±»ä¼¼ï¼åªæ¯å¢å äºnullå¼çæ¯è¾ã
`range`: 表示使ç¨ç´¢å¼èå´æ¥è¯¢, éè¿ç´¢å¼å段èå´è·å表ä¸é¨åæ°æ®è®°å½. è¿ä¸ªç±»åé常åºç°å¨ =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN() æä½ä¸.
`index`: 表示å
¨ç´¢å¼æ«æ(full index scan), å
³é®å:æ¥è¯¢åæ®µåæ¡ä»¶é½æ¯ç´¢å¼æ¬èº«
index_mergeï¼è¡¨ç¤ºæ¥è¯¢ä½¿ç¨äºä¸¤ä¸ªä»¥ä¸çç´¢å¼ï¼æåå交éæè
å¹¶éï¼å¸¸è§and ï¼orçæ¡ä»¶ä½¿ç¨äºä¸åçç´¢å¼.æç䏿¯å¾é« å
³é®å:ç´¢å¼åå¹¶
unique_subqueryï¼ç¨äºwhereä¸çinå½¢å¼åæ¥è¯¢ï¼åæ¥è¯¢è¿åä¸éå¤å¼å¯ä¸å¼
index_subqueryï¼ç¨äºinå½¢å¼åæ¥è¯¢ä½¿ç¨å°äºè¾
å©ç´¢å¼æè
in常æ°å表ï¼åæ¥è¯¢å¯è½è¿åéå¤å¼ï¼å¯ä»¥ä½¿ç¨ç´¢å¼å°åæ¥è¯¢å»éã
fulltextï¼å
¨æç´¢å¼æ£ç´¢ï¼è¦æ³¨æï¼å
¨æç´¢å¼çä¼å
级å¾é«ï¼è¥å
¨æç´¢å¼åæ®éç´¢å¼åæ¶å卿¶ï¼mysqlä¸ç®¡ä»£ä»·ï¼ä¼å
éæ©ä½¿ç¨å
¨æç´¢å¼
allï¼è¿ä¸ªå°±æ¯å
¨è¡¨æ«ææ°æ®æä»¶ï¼ç¶ååå¨serverå±è¿è¡è¿æ»¤è¿å符åè¦æ±çè®°å½ã
```
主è¦å为ä¸ä¸ªæ¹é¢
* 1.åå°è¯·æ±çæ°æ®é
åæ¹é¢ï¼é¿å
使ç¨SELECT *ï¼åªè¿åå¿
è¦çåã
è¡æ¹é¢ï¼ä½¿ç¨limitè¯å¥æ¥éå¶è¿åçæ°æ®è¡æ°ã
对é¢ç¹è®¿é®çæ°æ®å ç¼åï¼åå¨redisä¸ã
* 2.åå°æå¡ç«¯æ«æçè¡æ°ï¼ä¸»è¦éè¿ä½¿ç¨ç´¢å¼åå½ä¸ç´¢å¼æ¥å®ç°ã
使ç¨ç´¢å¼æ¹é¢ï¼å°±æ¯å»æ·»å ä¸äºç´¢å¼ï¼ä»¥å
2.1对äºä¸äºå¸¸ç¨çæ¡ä»¶æ¥è¯¢å段ï¼å»ºç«èåç´¢å¼ï¼ä½¿ç¨ä¸äºèåç´¢å¼ï¼å¯ä»¥åå°æ¥è¯¢æ¬¡æ°ï¼ä¹å¯ä»¥åå°ç£ç空é´å ç¨ãèä¸å½æ¥è¯¢çåæ®µå¨ç´¢å¼ä¸å·²ç»å
嫿¶ï¼å°±ä¼ä½¿ç¨å°è¦çç´¢å¼ãæ¤æ¶å¨ç´¢å¼ä¸æ¥å°æ°æ®åå°±ä¸ç¨å¨å表äºã
2.2é¿å
卿¥è¯¢æ¶ï¼å¯¹ç´¢å¼å段è¿è¡è®¡ç®å使ç¨å½æ°ï¼è¿æ ·ä¼å¯¼è´ä¸éè¿ç´¢å¼æ¥è¯¢ï¼å°ä¸äºvarcharç±»åçåæ®µä¸æ´åæ°æ®è¿è¡æ¯è¾æ¶ï¼ä¼è§¦åéå¼ç±»å转æ¢ï¼ä»è使ç¨å½æ°ã
* 3.åå大æ¥è¯¢ï¼å 为大æ¥è¯¢å¨æ¥è¯¢æ¶å¯è½ä¼éä½å¾å¤æ°æ®ï¼ä¹éè¦è·åå°è¿äºæ°æ®çè¡éæè½è¿è¡æ¥è¯¢ï¼ååæå°æ¥è¯¢å¯ä»¥åå°éç«äºï¼åå°çå¾
è·åéçæ¶é´ã
### charç±»åä¸varcharç±»åçåºå«ï¼
charç±»å
charç±»åæ¯å®é¿çï¼å¨å
é¨å卿¶å®é
使ç¨é¿åº¦è¾çæ¶ä¼å¨å³è¾¹ç¨ç©ºæ ¼å¡«å
ï¼æä»¥æå
¥çæ°æ®å¦æå³è¾¹æç©ºæ ¼ä¼èªå¨æªæï¼å 为没æåæ³ç¥éæ¯èªå¸¦çè¿æ¯å¡«å
çã
å¯¹è±æå符ï¼ASCIIï¼å ç¨1个åèï¼å¯¹ä¸ä¸ªæ±åå ç¨ä¸¤ä¸ªåèã
éåæ¯è¡æ°æ®çé¿åº¦æ¯è¾å¹³åçæ
åµï¼å¦åä¼é æåå¨ç©ºé´ç浪费ã
varcharç±»å
æ¯ä¸å®é¿çï¼æä¸ä¸ªåèç¨æ¥åå¨é¿åº¦(å½é¿åº¦å¤§äº255æ¶ï¼ä½¿ç¨ä¸¤ä¸ªåèæ¥åå¨é¿åº¦)ï¼å
é¨å卿¶ï¼ä½¿ç¨å¤å°é¿åº¦ï¼å
åä¸å°±å ç¨å¤å°é¿åº¦ï¼ä¸ä¼æç©ºä½ï¼æä»¥æ¯è¾èç空é´ã
varcharçå卿¹å¼æ¯ï¼å¯¹æ¯ä¸ªè±æå符å ç¨2个åèï¼æ±åä¹å ç¨2个åèã
æçä¸å
¶å®varcharä¼å¥½ä¸ç¹ï¼å
¶å®ç½ä¸æ²¡ææ¯è¾è¯¦å°½çæµè¯ï¼çä¸ä¸ªå客对1000wçæ°æ®è¿è¡æµè¯æ¶ï¼varcharä¼ç¥é«ä¸ç¹ã
### å¦ä½ä¼åMySQLæ
¢æ¥è¯¢ï¼
é¦å
对EXPLAIN åææ¥è¯¢è¯å¥åextralåæ®µä¸åºç°çä¸äºåæ°è¿è¡è¯´æï¼
##### Using index
使ç¨äºç´¢å¼è¿è¡æ¥è¯¢
##### Using where
å°±æ¯å¨innodbæ°æ®å¼æå°ç»æè¿ååï¼MySQL Serverå±å¯¹æ°æ®è¿è¡è¿ä¸æ¥çè¿æ»¤ï¼ç¶åè¿åç»æã
##### Using filesort
妿å¨å
³è表æ¥è¯¢æ¶ï¼Order Byçææåæ®µé½æ¥èªç¬¬ä¸ä¸ªè¡¨(ä¹å°±æ¯é©±å¨è¡¨)ï¼é£ä¹å¨å¤ç驱å¨è¡¨æ¶ï¼ä»é©±å¨è¡¨ä¸ååºæ»¡è¶³æ¡ä»¶çç»æéæ¶å°±ä¼è¿è¡æåºï¼ä¸ä¼æ¶åå°ä¸´æ¶è¡¨ã
##### Using temporary; Using fileSort
åè¿è¡å
³è表æ¥è¯¢æ¶ï¼å¦æOrder Byçåæ®µä¸å
¨æ¯æ¥èªé©±å¨è¡¨ï¼é£ä¹ä¼æå
³èç»æåæ¾å¨ä¸´æ¶è¡¨ä¸ï¼çææçå
³èé½ç»æåï¼åè¿è¡æä»¶æåºã
### ç´¢å¼çå建æ¥éª¤æ¯æä¹æ ·çï¼
éè¿ALTER TABLE ADD/DROPæè
CREATE/DROP INDEX å¯ä»¥å建åå é¤ç´¢å¼ã
```
//ALTER å½ä»¤å¯ä»¥ä¸ºè¡¨å¢å 主é®ç´¢å¼ï¼å¯ä¸æ§ç´¢å¼ï¼æ®éç´¢å¼
ALTER TABLE table_name add primary key (column_list) ;
ALTER TABLE table_name ADD INDEX index_name (column list);
ALTER TABLE table_name DROP INDEX index_name (column list);
//CREATE å½ä»¤å¯ä»¥ä¸ºè¡¨å¢å å¯ä¸æ§ç´¢å¼ï¼æ®éç´¢å¼
CREATE index index_name on table_name (column_list);
DROP index index_name on table_name (column_list);
```
MySQLæ¥åå°å建索å¼çå½ä»¤åï¼ä¼è¿è¡å建索å¼
##### Fast Index Creation
å¨MySQL 5.5ä¹åå建索å¼ä¸»è¦æ¯éè¿
1.å建临æ¶è¡¨ï¼è¡¨ç»ææ¯æ·»å ç´¢å¼åçè¡¨ç»æ
2.å°åè¡¨æ°æ®å¯¼å
¥å°ä¸´æ¶è¡¨
3.å é¤å表
4.å°ä¸´æ¶è¡¨éå½åæåæ¥ç表å
Innodbå¨1.0ä¹åæ¯æFast Index Creationï¼å°±æ¯æ·»å è¾
å©ç´¢å¼ï¼ä¸»é®ä»¥å¤çç´¢å¼ï¼ï¼ä¸éè¦é建表ï¼åªéè¦å¯¹è¡¨å Séï¼å éæé´è¡¨åªè½è¯»ï¼ä¸è½åï¼ï¼ç¶åå建索å¼ï¼å¯¹ä¸»é®å ç´¢å¼è¿æ¯éè¦é建表ã
##### Online DDL
å°±æ¯innodbå¨åå»ºç´¢å¼æ¶ï¼ä¼å°æ°æ®åºçå¢å æ¹å½ä»¤åå
¥ç¼åæ¥å¿ï¼åå»ºå®æ¯åéè¿éæ¾æ¥å¿æ¥ä¿ææ°æ®åºçæç»ä¸è´æ§ã
### MySQLçjoinçå®ç°æ¯æä¹æ ·çï¼
https://blog.csdn.net/u010841296/article/details/89790399
1.ä»ä¹æ¯Nested-Loop Joinï¼
2.Index Nested-Loop Joinæä¹ä¼åè¿æ¥ï¼
3.Block Nested-Loop Joinæä¹ä¼åè¿æ¥ï¼
ä¸.Nested-Loop Join
å¨Mysqlä¸ï¼ä½¿ç¨Nested-Loop Joinçç®æ³ææ³å»ä¼åjoinï¼Nested-Loop Joinç¿»è¯æä¸æåæ¯âåµå¥å¾ªç¯è¿æ¥âã
举个ä¾åï¼
```
select * from t1 inner join t2 on t1.id=t2.tid
```
ï¼1ï¼t1称为å¤å±è¡¨ï¼ä¹å¯ç§°ä¸ºé©±å¨è¡¨ã
ï¼2ï¼t2称为å
å±è¡¨ï¼ä¹å¯ç§°ä¸ºè¢«é©±å¨è¡¨ã
//伪代ç 表示ï¼
```
List