MySQLç´¢å¼ä¼å & èç°ç´¢å¼ & åæ®µéæ©æ§ & èå´æ¥è¯¢ & ç»åç´¢å¼çåæ®µé¡ºåº
ç´¢å¼B-Treeï¼
ä¸è¬æ¥è¯´ï¼ MySQL ä¸ç B-Tree ç´¢å¼çç©çæä»¶å¤§å¤é½æ¯ä»¥ B+treeçç»ææ¥åå¨çï¼ä¹å°±æ¯ææå®é
éè¦çæ°æ®é½åæ¾äº Tree ç Leaf Nodeï¼èä¸å°ä»»ä½ä¸ä¸ª Leaf Node çæçè·¯å¾çé¿åº¦é½æ¯å®å
¨ç¸åçï¼å¯è½åç§æ°æ®åºï¼æ MySQL çåç§åå¨å¼æï¼å¨åæ¾èªå·±ç B-Tree ç´¢å¼çæ¶åä¼å¯¹åå¨ç»æç¨ä½æ¹é ãå¦ Innodb åå¨å¼æç B-Tree ç´¢å¼å®é
使ç¨çåå¨ç»æå®é
䏿¯ B+Tree ï¼ä¹å°±æ¯å¨ B-Tree æ°æ®ç»æçåºç¡ä¸åäºå¾å°çæ¹é ï¼å¨æ¯ä¸ä¸ªLeaf Node ä¸é¢åºäºåæ¾ç´¢å¼é®å¼å主é®çç¸å
³ä¿¡æ¯ä¹å¤ï¼B+Treeè¿åå¨äºæåä¸è¯¥ Leaf Node ç¸é»çåä¸ä¸ª LeafNode çæéä¿¡æ¯ï¼è¿ä¸»è¦æ¯ä¸ºäºå å¿«æ£ç´¢å¤ä¸ªç¸é» Leaf Node çæçèèã
B-Tree对索å¼åæ¯é¡ºåºç»ç»åå¨çï¼æä»¥å¾é忥æ¾èå´æ°æ®ï¼ä¾å¦ï¼å¨ä¸ä¸ªåºäºææ¬åçç´¢å¼æ ä¸ï¼æåæ¯é¡ºåºä¼ éè¿ç»çå¼è¿è¡æ¥æ¾æ¯é常åéçï¼æä»¥å âæ¾åºææä»¥ A å° K å¼å¤´çååâ è¿æ ·çæ¥æ¾æçä¼é常é«ã
å ä¸ºç´¢å¼æ ä¸çèç¹æ¯æåºçï¼æä»¥é¤äºæå¼æ¥æ¾ä¹å¤ï¼ç´¢å¼è¿å¯ä»¥ç¨äºæ¥è¯¢ä¸çORDER BYï¼æé¡ºåºæ¥æ¾ï¼ï¼GROUP BYï¼æåç»æ¥æ¾ï¼æä½ãä¸è¬æ¥è¯´ï¼å¦æ B-Tree å¯ä»¥æç §æç§æ¹å¼æ¥æ¾å°å¼ï¼é£ä¹ä¹å¯ä»¥æç §è¿ç§æ¹å¼ç¨äºæåºãæä»¥ï¼ç´¢å¼å¯¹ ORDER BY åå¥ä¹å¯ä»¥æ»¡è¶³å¯¹åºçæåºéæ±ã
å¨innodb弿ä¸ï¼btreeç´¢å¼å为两ç§ï¼1ï¼èç°ç´¢å¼ï¼ä¸»é®ç´¢å¼ï¼ï¼æè 说å«èéç´¢å¼ï¼å ä¸ºæ°æ®çé»è¾é¡ºåºä¸ç©ç顺åºé½æ¯ç´§åçã2.äºçº§ç´¢å¼ï¼éèç°ç´¢å¼ï¼ï¼æè 说å«è¾ å©ç´¢å¼ãInnoDBä¸ç主é®ç´¢å¼æ¯èéç´¢å¼ï¼è¡¨æ°æ®æä»¶æ¬èº«å°±æ¯æB+Treeç»ç»çä¸ä¸ªç´¢å¼ç»æï¼è¿æ£µæ çå¶èç¹dataåä¿åäºå®æ´çæ°æ®è®°å½ï¼æ´è¡æ°æ®ï¼ãè¿ä¸ªç´¢å¼çkeyæ¯æ°æ®è¡¨ç主é®ï¼å æ¤InnoDBè¡¨æ°æ®æä»¶æ¬èº«å°±æ¯ä¸»é®ç´¢å¼ã使¯innodbçäºçº§ç´¢å¼ï¼ä¿åçæ¯ç´¢å¼åå¼ä»¥åæå主é®çæéï¼æä»¥æä»¬ä½¿ç¨è¦çç´¢å¼çåä¼åå¤çå°±æ¯é对mysqlçinnodbçç´¢å¼èè¨çã
ä¸é¢ä¸¤å¼ 徿¾ç¤ºmysqlä¸innodbåmyisam弿çç´¢å¼å®ç°çåç
çä¸å»èç°ç´¢å¼çæçææ¾è¦ä½äºéèç°ç´¢å¼ï¼å ä¸ºæ¯æ¬¡ä½¿ç¨è¾
å©ç´¢å¼æ£ç´¢é½è¦ç»è¿ä¸¤æ¬¡B+æ æ¥æ¾ï¼è¿ä¸æ¯å¤æ¤ä¸ä¸¾åï¼èç°ç´¢å¼çä¼å¿å¨åªï¼
-
ç±äºè¡æ°æ®åå¶åèç¹åå¨å¨ä¸èµ·ï¼è¿æ ·ä¸»é®åè¡æ°æ®æ¯ä¸èµ·è¢«è½½å ¥å åçï¼æ¾å°å¶åèç¹å°±å¯ä»¥ç«å»å°è¡æ°æ®è¿åäºï¼å¦ææç §ä¸»é®Idæ¥ç»ç»æ°æ®ï¼è·å¾æ°æ®æ´å¿«ã
-
è¾ å©ç´¢å¼ä½¿ç¨ä¸»é®ä½ä¸º"æé" è䏿¯ä½¿ç¨è¡å°åå¼ä½ä¸ºæéç好夿¯ï¼åå°äºå½åºç°è¡ç§»å¨æè æ°æ®é¡µåè£æ¶è¾ å©ç´¢å¼çç»´æ¤å·¥ä½ï¼ä½¿ç¨ä¸»é®å¼å½ä½æéä¼è®©è¾ å©ç´¢å¼å ç¨æ´å¤ç空é´ï¼æ¢æ¥ç好夿¯InnoDBå¨ç§»å¨è¡æ¶æ é¡»æ´æ°è¾ å©ç´¢å¼ä¸çè¿ä¸ª"æé"ï¼ä½¿ç¨èç°ç´¢å¼å¯ä»¥ä¿è¯ä¸ç®¡è¿ä¸ªä¸»é®B+æ çèç¹å¦ä½ååï¼è¾ å©ç´¢å¼æ é½ä¸åå½±åã
å ³äº InnoDBï¼ç´¢å¼åéæä¸äºå¾å°æäººç¥éçç»èï¼InnoDB å¨äºçº§ç´¢å¼ä¸ä½¿ç¨å ±äº«ï¼è¯»ï¼éï¼ä½è®¿é®ä¸»é®ç´¢å¼éè¦æä»ï¼åï¼éãè¿æ¶é¤äºä½¿ç¨è¦çç´¢å¼çå¯è½æ§ï¼å¹¶ä¸ä½¿å¾ SELECT FOR UPDATE æ¯ LOCK IN SHARE MODE æéé宿¥è¯¢è¦æ ¢å¾å¤ã
åååï¼æ¦å¿µæ¯å¤äºã
ä½ éè¦ç¥éçï¼
-
ä¸è¦æ±æ¯ä¸ªäººä¸å®çè§£ è表æ¥è¯¢(join/left join/inner joinç)æ¶çmysqlè¿ç®è¿ç¨ï¼ä½å¯¹äºåæ®µéæ©æ§å·®æå³çä»ä¹ï¼ç»åç´¢å¼åæ®µé¡ºåºæå³çä»ä¹ï¼è¦æ±æ¯ä¸ªäººå¿ é¡»äºè§£ï¼
-
æmysql客æ·ç«¯ï¼å¦SQLyogï¼å¦HeidiSQLï¼æ¾å¨æ¡é¢ä¸ï¼æ¶ä¸æ¶æ¿åºæ¥ explain 䏿ï¼è¿æ¯ä¸ç§ç¾å¾·ï¼
-
ç¡®ä¿äº²ææ¥è¿SQLçæ§è¡è®¡åï¼ä¸å®è¦æ³¨æçæ§è¡è®¡åéç possible_keysãkeyårowsè¿ä¸ä¸ªå¼ï¼è®©å½±åè¡æ°å°½éå°ï¼ä¿è¯ä½¿ç¨å°æ£ç¡®çç´¢å¼ï¼åå°ä¸å¿ è¦çUsing temporary/Using filesortï¼
-
ä¸è¦å¨éæ©æ§é常差çåæ®µä¸å»ºç´¢å¼ï¼åå åè§ä¼åçç¥Aï¼
-
æ¥è¯¢æ¡ä»¶éåºç°èå´æ¥è¯¢ï¼å¦A>7ï¼A in (2,3)ï¼æ¶ï¼è¦è¦æï¼ä¸è¦å»ºäºç»åç´¢å¼å´å®å ¨ç¨ä¸ä¸ï¼åå åè§ä¼åçç¥Bï¼
ââåæ®µéæ©æ§çåºç¡ç¥è¯
å¼åï¼ä»ä¹å段é½å¯ä»¥å»ºç´¢å¼åï¼
å¦ä¸è¡¨æç¤ºï¼sort åæ®µçéæ©æ§é常差ï¼ä½ å¯ä»¥æ§è¡ show index from ads å½ä»¤å¯ä»¥çå° sort ç Cardinalityï¼æ£åç¨åº¦ï¼åªæ 9ï¼è¿ç§åæ®µä¸æ¬ä¸åºè¯¥å»ºç´¢å¼ï¼
ä¼åçç¥Aï¼åæ®µéæ©æ§
-
éæ©æ§è¾ä½ç´¢å¼ å¯è½å¸¦æ¥çæ§è½é®é¢
-
ç´¢å¼éæ©æ§=ç´¢å¼åå¯ä¸å¼/è¡¨è®°å½æ°ï¼
-
éæ©æ§è¶é«ç´¢å¼æ£ç´¢ä»·å¼è¶é«ï¼æ¶èç³»ç»èµæºè¶å°ï¼éæ©æ§è¶ä½ç´¢å¼æ£ç´¢ä»·å¼è¶ä½ï¼æ¶èç³»ç»èµæºè¶å¤ï¼
-
æ¥è¯¢æ¡ä»¶å«æå¤ä¸ªå段æ¶ï¼ä¸è¦å¨éæ©æ§å¾ä½å段ä¸å建索å¼
-
å¯éè¿å建ç»åç´¢å¼æ¥å¢å¼ºä½åæ®µéæ©æ§åé¿å éæ©æ§å¾ä½å段å建索å¼å¸¦æ¥å¯ä½ç¨ï¼
-
å°½éåå°possible_keysï¼æ£ç¡®ç´¢å¼ä¼æé«sqlæ¥è¯¢é度ï¼è¿å¤ç´¢å¼ä¼å¢å ä¼åå¨éæ©ç´¢å¼ç代价ï¼ä¸è¦æ»¥ç¨ç´¢å¼ï¼
ââç»åç´¢å¼å段顺åºä¸èå´æ¥è¯¢ä¹é´çå ³ç³»
å¼åï¼èå´æ¥è¯¢ city_id in (0,8,10) è½ç¨ç»åç´¢å¼ (ads_id,city_id) åï¼
举ä¾ï¼
ac 表æä¸ä¸ªç»åç´¢å¼(ads_id,city_id)ã
é£ä¹å¦ä¸ ac.city_id IN (0, 8005) æ¥è¯¢æ¡ä»¶è½ç¨å° ac表çç»åç´¢å¼(ads_id,city_id) åï¼
EXPLAIN
SELECT ac.ads_id
FROM ads, ac
WHERE
ads.id = ac.ads_id
AND ac.city_id IN (0, 8005)
AND ads.status = 'online'
AND ac.start_time<UNIX_TIMESTAMP()
AND ac.end_time>UNIX_TIMESTAMP()
ä¼åçç¥Bï¼
ç±äº mysql ç´¢å¼æ¯åºäº B-Tree çï¼æä»¥ç»åç´¢å¼æâåæ®µé¡ºåºâæ¦å¿µã
æä»¥ï¼æ¥è¯¢æ¡ä»¶ä¸æ ac.city_id IN (0, 8005)ï¼èç»åç´¢å¼æ¯ (ads_id,city_id)ï¼å该æ¥è¯¢æ æ³ä½¿ç¨å°è¿ä¸ªç»åç´¢å¼ã
DBAæ»ç»éï¼
ç»åç´¢å¼æ¥è¯¢çåç§åºæ¯
å ¹æ Index (A,B,C) ââç»åç´¢å¼å¤åæ®µæ¯æåºçï¼å¹¶ä¸æ¯ä¸ªå®æ´çBTree ç´¢å¼ã
-
ä¸é¢æ¡ä»¶å¯ä»¥ç¨ä¸è¯¥ç»åç´¢å¼æ¥è¯¢ï¼
-
A>5
-
A=5 AND B>6
-
A=5 AND B=6 AND C=7
-
A=5 AND B IN (2,3) AND C>5
-
ä¸é¢æ¡ä»¶å°ä¸è½ç¨ä¸ç»åç´¢å¼æ¥è¯¢ï¼
-
B>5 ââæ¥è¯¢æ¡ä»¶ä¸å å«ç»åç´¢å¼é¦ååæ®µ
-
B=6 AND C=7 ââæ¥è¯¢æ¡ä»¶ä¸å å«ç»åç´¢å¼é¦ååæ®µ
-
ä¸é¢æ¡ä»¶å°è½ç¨ä¸é¨åç»åç´¢å¼æ¥è¯¢ï¼
-
A>5 AND B=2 ââå½èå´æ¥è¯¢ä½¿ç¨ç¬¬ä¸åï¼æ¥è¯¢æ¡ä»¶ä» ä» è½ä½¿ç¨ç¬¬ä¸å
-
A=5 AND B>6 AND C=2 ââèå´æ¥è¯¢ä½¿ç¨ç¬¬äºåï¼æ¥è¯¢æ¡ä»¶ä» ä» è½ä½¿ç¨åäºå
ç»åç´¢å¼æåºçåç§åºæ¯
å ¹æç»åç´¢å¼ Index(A,B)ã
-
ä¸é¢æ¡ä»¶å¯ä»¥ç¨ä¸ç»åç´¢å¼æåºï¼
-
ORDER BY Aââé¦åæåº
-
A=5 ORDER BY Bââ第ä¸åè¿æ»¤å第äºåæåº
-
ORDER BY A DESC, B DESCââæ³¨æï¼æ¤æ¶ä¸¤å以ç¸åé¡ºåºæåº
-
A>5 ORDER BY Aââæ°æ®æ£ç´¢åæåºé½å¨ç¬¬ä¸å
-
ä¸é¢æ¡ä»¶ä¸è½ç¨ä¸ç»åç´¢å¼æåºï¼
-
ORDER BY B ââæåºå¨ç´¢å¼ç第äºå
-
A>5 ORDER BY B ââèå´æ¥è¯¢å¨ç¬¬ä¸åï¼æåºå¨ç¬¬äºå
-
A IN(1,2) ORDER BY B ââçç±åä¸
-
ORDER BY A ASC, B DESC ââæ³¨æï¼æ¤æ¶ä¸¤å以ä¸åé¡ºåºæåº
顺çç»åç´¢å¼æä¹å»ºç»§ç»å¾ä¸å»¶ä¼¸ï¼è¯·å使³¨æâç´¢å¼åå¹¶âæ¦å¿µï¼
-
MySQL 5,0以ä¸çæ¬ï¼SQLæ¥è¯¢æ¶ï¼ä¸å¼ 表åªè½ç¨ä¸ä¸ªç´¢å¼ï¼use at most only one index for each referenced tableï¼ï¼
-
ä» MySQL 5.0å¼å§ï¼å¼å ¥äº index merge æ¦å¿µï¼å æ¬ Index Merge Union Access Algorithmï¼å¤ä¸ªç´¢å¼å¹¶é访é®ï¼ï¼å æ¬Index Merge Intersection Access Algorithmï¼å¤ä¸ªç´¢å¼äº¤é访é®ï¼ï¼å¯ä»¥å¨ä¸ä¸ªSQLæ¥è¯¢éç¨å°ä¸å¼ 表éçå¤ä¸ªç´¢å¼ã
-
MySQL å¨5.6.7ä¹åï¼ä½¿ç¨ index merge æä¸ä¸ªéè¦çåææ¡ä»¶ï¼æ²¡æ range å¯ä»¥ä½¿ç¨ã
ç´¢å¼åå¹¶çç®å说æï¼
-
MySQL ç´¢å¼åå¹¶è½ä½¿ç¨å¤ä¸ªç´¢å¼
-
SELECT * FROM TB WHERE A=5 AND B=6
-
è½åå«ä½¿ç¨ç´¢å¼(A) å (B) æ ç´¢å¼åå¹¶ï¼
-
å建ç»åç´¢å¼(A,B) æ´å¥½ï¼
-
SELECT * FROM TB WHERE A=5 OR B=6
-
è½åå«ä½¿ç¨ç´¢å¼(A) å (B) æ ç´¢å¼åå¹¶ï¼
-
ç»åç´¢å¼(A,B)ä¸è½ç¨äºæ¤æ¥è¯¢ï¼åå«å建索å¼(A) å (B)伿´å¥½ï¼
-
æè ä½¿ç¨ UNION ALLï¼SELECT * FROM TB WHERE A=5 UNION ALL SELECT * FROM TB WHERE A=6
ä¼å LIMIT å页ï¼
-
ä¼å大åç§»éçæ§è½ï¼å°½å¯è½å°ä½¿ç¨ç´¢å¼è¦çæ«æï¼è䏿¯æ¥è¯¢ææçåï¼ç¶åæ ¹æ®éè¦å䏿¬¡å ³èæä½åè¿åæéçå
-
å¦âå»¶è¿å ³èâï¼SELECT * FROM TB INNER JOIN (SELECT id FROM TB ORDER BY id LIMIT 50,5) AS TB1 USING(id)
-
ææ¶åä¹å¯ä»¥å° LIMIT æ¥è¯¢è½¬æ¢ä¸ºå·²ç¥ä½ç½®çæ¥è¯¢ï¼è®© MySQL éè¿èå´æ«æè·å¾å¯¹åºçç»æ
-
LIMIT å OFFSET çé®é¢ï¼å ¶å®æ¯ OFFSET çé®é¢ï¼å®ä¼å¯¼è´ MySQL æ«æå¤§éä¸éè¦çè¡ç¶ååæå¼æãæä»¥æä»¬åºè¯¥å°½å¯è½å°é¿å è¿ç§å¤§éæ«æè¡çè¡ä¸ºæ¥ä¼åå页æ¥è¯¢
æåçæ»ç»ï¼
ä»ç¶æ¯å¼ºè°å强è°ï¼
è®°ä½ï¼explain ååææµæ¯ä¸ç§ç¾å¾·ï¼