ç´¢å¼åç
è¿é主è¦è®¨è®ºä¸ä¸ MySQL InnoDB åå¨å¼æï¼åºäºB-æ ï¼ä½å®é ä¸MySQLéç¨çæ¯B+æ ç»æï¼çç´¢å¼ç»æã
䏿¬¡ç´¢å¼çè¿ç¨å¤§è´å¦ä¸å¾æç¤ºï¼
é¦å æ¥çä¸ä¸ç£ççç»æï¼å ¶ç¤ºæå¾å¦ä¸æç¤ºï¼
读/åç£çæä¸ä½ç½®çæ¥éª¤å¦ä¸ï¼
- é¦å æ ¹æ®æ±é¢å·ï¼ç§»å¨è¯»åç£å¤´ï¼ä½¿ç£å¤´ç§»å¨å°ç¸åºçæ±é¢ä¸ï¼è¿ä¸è¿ç¨è¢«ç§°ä¸ºå®ä½ææ¥æ¾ï¼
- ææç£å¤´é½å®ä½å°æ±é¢å·å¯¹åºçç£éä¸åï¼è¿æ¶æ ¹æ®çé¢å·æ¥ç¡®å®æå®çé¢å·ä¸çå ·ä½ç£éï¼
- çé¢ç¡®å®åï¼ççå¼å§æè½¬ï¼å°æå®æåºå·çç£é段移å¨è³è¯»åç£å¤´ä¸ï¼
ç»è¿ä»¥ä¸æ¥éª¤ï¼æå®æ°æ®çåå¨ä½ç½®å°±è¢«æ¾å°äºï¼è¿æ¶å°±å¯ä»¥å¼å§è¯»/åæä½äºã
å¯ä»¥çå°ï¼ç£ç I/O ä¾é çæ¯æºæ¢°è¿å¨ï¼å ¶æ§è½æå¨ä¸»è¦å为å¦ä¸ä¸ä¸ªææ ï¼
- 坻鿶é´(seek): æå°è¯»åç£å¤´ç§»å¨å°æå®ç£é䏿éè¦çæ¶é´ï¼è¿é¨åæ¶é´ä»£ä»·æé«ï¼
- æè½¬å»¶è¿æ¶é´(rotation): æç£çæè½¬å°ç®æ æåºç§»å¨å°è¯»åç£å¤´ä¸æ¹æéçæ¶é´ï¼å ¶åå³äºç£çç转éï¼
- æ°æ®ä¼ è¾æ¶é´(transfer): æå®ææ°æ®ä¼ è¾æéçæ¶é´ï¼å ¶åå³äºæ¥å£çæ°æ®ä¼ è¾éçï¼
å¯¹äºæä½ç³»ç»æ¥è¯´ï¼å½ç¨åºéè¦è¯»åçæ°æ®ä¸å¨å å䏿¶ï¼è¿æ¶å°±ä¼è§¦åä¸ä¸ªç¼ºé¡µä¸æï¼é£ä¹ç³»ç»å°±ä¼åç£çååºè¯»ä¿¡å·ï¼ç£çä¼æç § Block è¿è¡è¯»åï¼å°å ¶è½½å ¥å åï¼é常ä¸ä¸ª Block 为 16Kã
卿ä½ç³»ç»çå åç®¡çæºå¶ä¸ï¼å®æ¯ä»¥ Page 为åä½çï¼é常为 4K æ 16Kï¼èä¸ä¸ª Block ç大å°åæ¯ Page çæ´æ°åã
å设ç°å¨ä»ç£çä¸è¯»åäº 2000 ä¸å¾ç´¢å¼å°å åä¸ï¼å¦æä½¿ç¨ AVL äºåå¹³è¡¡æ æ¥åå¨ï¼å¦å¾æç¤ºï¼
å ¶ä¸ï¼æ¯ä¸ªäºåæ èç¹åªè½åå¨ä¸ä¸ªç´¢å¼ï¼é£ä¹å ¶æ é«å¤§çº¦ä¸º log220000000â25log220000000â25ï¼ä¹å°±æ¯è¯´ï¼å¦æå¨æåçæ åµä¸ï¼å³æ¯ä¸å±çèç¹é½ä½äºä¸åç Block ä¸ï¼é£ä¹æ»å ±éè¦ 25 次ç£ç IO æä½ã
è B- æ 忝ä¸ä¸ª m é¶ç平衡æ ï¼é常 m å 300~500ï¼å³ä¸ä¸ªèç¹ä¸æ m 个åèç¹ãå¦æä½¿ç¨ B- æ çç»ææ¥è¿è¡åå¨ï¼å妿¤æ¶ m å 500ï¼é£ä¹å ¶æ é«å¤§çº¦ä¸º logm20000000=log50020000000â3logm20000000=log50020000000â3ï¼ä¹å°±æ¯è¯´ï¼å¨æåçæ åµä¸ï¼åªéè¦ 3 次ç£ç I/O æä½å³å¯å®æãé常 m ç大å°åå¼åå³äºä¸æ¬¡ç£ç I/O æä½æè¯»åçå 容è½å好åå¨å¨ä¸ä¸ªèç¹ä¸ã
ä»ä¸å¾å¯ä»¥çå°B-æ åå¨ç缺ç¹ï¼
- æ¯ä¸ªèç¹ä¸æ Keyï¼ä¹æ Dataï¼ä½æ¯æ¯ä¸ä¸ªèç¹çåå¨ç©ºé´æ¯æéçï¼å¦æ Data æ°æ®è¾å¤§æ¶ä¼å¯¼è´æ¯ä¸ªèç¹è½åå¨ç Key çæ°æ®å¾å°ï¼
- å½åå¨çæ°æ®éå¾å¤§æ¶åæ ·ä¼å¯¼è´B-æ çé«åº¦è¾å¤§ï¼ç£ç IO 次æ°è±è´¹å¢å¤§ï¼æçéä½ï¼
å æ¤é对å¦ä¸ç¼ºç¹ååºäºä¼åï¼å½¢æäºB+æ çæ°æ®ç»æï¼å¦å¾æç¤ºï¼
é£ä¹ MySQL æç»ä¸ºä»ä¹è¦éç¨B+æ åå¨ç´¢å¼ç»æå¢ï¼é£ä¹ççB-æ åB+æ å¨åå¨ç»æä¸æä»ä¹ä¸åï¼
- B-æ çæ¯ä¸ä¸ªèç¹ï¼åäºå ³é®åå对åºçæ°æ®å°åï¼èB+æ çéå¶åèç¹åªåå ³é®åï¼ä¸åæ°æ®å°åãå æ¤B+æ çæ¯ä¸ä¸ªéå¶åèç¹åå¨çå ³é®åæ¯è¿è¿å¤äºB-æ çï¼B+æ çå¶åèç¹åæ¾å ³é®ååæ°æ®ï¼å æ¤ï¼ä»æ çé«åº¦ä¸æ¥è¯´ï¼B+æ çé«åº¦è¦å°äºB-æ ï¼ä½¿ç¨çç£ç I/O 次æ°å°ï¼å æ¤æ¥è¯¢ä¼æ´å¿«ä¸äºã
- B-æ ç±äºæ¯ä¸ªèç¹é½åå¨å ³é®ååæ°æ®ï¼å æ¤ç¦»æ ¹èç¹è¿çæ°æ®ï¼æ¥è¯¢ç就快ï¼ç¦»æ ¹èç¹è¿çæ°æ®ï¼æ¥è¯¢çå°±æ ¢ï¼B+æ ææçæ°æ®é½åå¨å¶åèç¹ä¸ï¼å æ¤å¨B+æ ä¸æç´¢å ³é®åï¼æ¾å°å¯¹åºæ°æ®çæ¶é´æ¯æ¯è¾å¹³åçï¼æ²¡æå¿«æ ¢ä¹åã
- å¨B-æ ä¸å¦æååºé´æ¥æ¾ï¼éåçèç¹æ¯é常å¤çï¼B+æ ææå¶åèç¹è¢«è¿æ¥æäºæåºé¾è¡¨ç»æï¼å æ¤åæ´è¡¨éåååºé´æ¥æ¾æ¯é常容æçã
ç°å¨æè¿æ ·ä¸å¼ æ°æ®è¡¨ï¼
mysql> select * from student;+-----+-------------+-----+-----+| uid | name | age | sex |+-----+-------------+-----+-----+| 1 | zhangsan | 18 | M || 2 | gaoyang | 20 | W || 3 | chenwei | 22 | M || 4 | linfeng | 21 | W || 5 | liuxiang | 19 | W || 6 | niuer | 17 | M || 7 | liuxiaohong | 28 | W || 8 | gaolishi | 37 | M || 9 | yuanwei | 13 | W |+-----+-------------+-----+-----+
å ¶ä¸ï¼ä¸»é®å段为 uidï¼é£ä¹å¯¹äºä¸åçä¸å¡åºæ¯ï¼å ¶æ¥è¯¢çæ¹å¼æ¯ä¸åçã
æ åµ1
æ¥è¯¢è¯å¥å¦ä¸ï¼
SELECT * FROM student WHERE uid=5;
ä½¿ç¨ explain å ³é®åæ¥ç该è¯å¥çæç´¢ç»èå¦ä¸ï¼
è§å¯ type åæ®µå¯ç¥è¯¥æ¥è¯¢ä¸ºå¸¸å¼æ¥è¯¢ï¼rows åæ®µå表示该æ¥è¯¢åªéåäº 1 è¡ï¼ä¹å°±æ¯ä» B+ æ çæ ¹èç¹å¼å§è¿è¡æç´¢ï¼
æ åµ2
æ¥è¯¢è¯å¥å¦ä¸ï¼
SELECT * FROM student WHERE uid<5;
ä½¿ç¨ explain å ³é®åæ¥ç该è¯å¥çæç´¢ç»èå¦ä¸ï¼
è§å¯ type åæ®µå¯ç¥è¯¥æ¥è¯¢ä¸ºèå´æ¥è¯¢ï¼rows åæ®µå表示该æ¥è¯¢éåäº 4 è¡ï¼ä¹å°±æ¯ä» B+ æ çå¶åèç¹æå¨å±çååé¾è¡¨è¿è¡æ¥è¯¢ï¼
æ åµ3
æ¥è¯¢è¯å¥å¦ä¸ï¼
SELECT * FROM student WHERE name='linfeng';
ä½¿ç¨ explain å ³é®åæ¥ç该è¯å¥çæç´¢ç»èå¦ä¸ï¼
è§å¯ type åæ®µå¯ç¥è¯¥æ¥è¯¢ä¸ºæ´è¡¨æ¥è¯¢ï¼rows åæ®µå表示该æ¥è¯¢éåäºè¯¥è¡¨çææè¡ï¼è¿æ¯å ä¸ºææ¥è¯¢ç name åæ®µå¹¶ä¸åå¨ç´¢å¼ãä¹å°±æ¯ä» B+ æ çå¶åèç¹æå¨å±çååé¾è¡¨è¿è¡æ¥è¯¢ï¼ä¸éåæ´ä¸ªé¾è¡¨ã
æ åµ4
ç°å¨ä½¿ç¨å¦ä¸è¯å¥ä¸º name åæ®µæ·»å ç´¢å¼ï¼å°å ¶è®¾ç½®ä¸ºæ®éç´¢å¼ï¼
create index nameidx on student(name);
æ¥çæææ¯å¦å建æ£ç¡®ï¼
mysql> show create table student\G*************************** 1. row *************************** Table: studentCreate Table: CREATE TABLE `student` ( `uid` int unsigned NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `age` tinyint unsigned NOT NULL, `sex` enum('M','W') NOT NULL, PRIMARY KEY (`uid`), KEY `nameidx` (`name`)) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb31 row in set (0.00 sec)
ç°å¨è¯¥è¡¨ä¸å°±ä¼åå¨ä¸¤ä¸ªç´¢å¼ï¼ä¸ä¸ªæ¯ä¸»é®é»è®¤å建ç主é®ç´¢å¼ï¼å¦ä¸ä¸ªåæ¯åææåå»ºçæ®éç´¢å¼ï¼ä¹ç§°ä¸ºè¾ å©ç´¢å¼ãé£ä¹å¨æå»º B+ æ æ¶ï¼ä¼ä¸ä½ä¼æå»ºä¸»é®ç´¢å¼ç B+ æ ï¼è¿ä¼æå»ºè¾ å©ç´¢å¼ç B+ æ ï¼ä¸å¨è¾ å©ç´¢å¼ç B+ æ çèç¹ä¸ç data åæ¾ç便æ¯ä¸»é®å段ã
ç°å¨æ§è¡å¦ä¸è¯å¥ï¼
SELECT uid FROM student WHERE name="linfeng";
ä½¿ç¨ explain å ³é®åæ¥ç该è¯å¥çæç´¢ç»èå¦ä¸ï¼
è§å¯ Extra åæ®µå¯ç¥ï¼å ¶æ¥è¯¢æ¯éè¿äºçº§ç´¢å¼æ è¿è¡æ¥æ¾ã
æ åµ5
ç°å¨æ§è¡å¦ä¸ SQL è¯å¥ï¼
SELECT * FROM student WHERE name="linfeng";
ä½¿ç¨ explain å ³é®åæ¥ç该è¯å¥çæç´¢ç»èå¦ä¸ï¼
ä¸ä¸è¿°ä¸ç§æ åµä¸åçæ¯ï¼æ¤æ¬¡æ¥è¯¢ç Extra åæ®µåä¸ºäº NULLï¼è¿æ¶å 为å¨äºçº§ç´¢å¼æ 䏿¥æ¾ç®æ å¼åªè½å¾å°å ¶ä¸»é®å¼ï¼èç°å¨éè¦ä¸»é®å¼æå¨è¡çæææ°æ®ï¼é£ä¹éè¦æ§è¡å¦ä¸è¿ç¨ï¼
- ç°å¨äºçº§ç´¢å¼æ 䏿 ¹æ®æ®éç´¢å¼æ¥æ¾å¾å°ä¸»é®å¼ï¼
- ç¶åå¨ä¸»é®ç´¢å¼æ 䏿 ¹æ®åæå¾å°ç主é®å¼è¿è¡æ¥æ¾å¾å°æææ°æ®ï¼
å¦ä¸è¿ç¨ç§°ä¹ä¸º å表ãæä»¥ï¼å¦æåçå表æä½ï¼ä¹å°±ä¼äº§çæ´å¤çæ¥æ¾åç£ç I/O æä½ï¼ä¼æ´èæ¶ã
èéç´¢å¼åéèéç´¢å¼
å¨ MyISAM 弿ä¸ï¼ç±äºç´¢å¼åæ°æ®åå¨å¨ä¸åç两个æä»¶ä¸ï¼æä»¥å ¶ä¸»é®ç´¢å¼æ åäºçº§ç´¢å¼æ æ¯ä¸æ ·çï¼å³äºçº§ç´¢å¼æ å¶åèç¹ä¸çæ°æ®æ¯æ´è¡æ°æ®ï¼èé主é®å¼ãç§°è¿ç§ç´¢å¼ä¸º éèéç´¢å¼ãè InnoDB 弿ä¸çç´¢å¼å称为 èéç´¢å¼ã
MyISAM
MyISAM å¼æä½¿ç¨ B+ æ ä½ä¸ºç´¢å¼ç»æï¼å¶èç¹ç Data ååæ¾çæ¯æ°æ®è®°å½çå°åãä¸å¾æ¯ MyISAM 主é®ç´¢å¼çåçå¾ï¼
å¨ MyISAM ä¸ï¼ä¸»é®ç´¢å¼åè¾ å©ç´¢å¼(Secondary key)å¨ç»æä¸æ²¡æä»»ä½åºå«ï¼åªæ¯ä¸»é®ç´¢å¼è¦æ± Key æ¯å¯ä¸çï¼èè¾ å©ç´¢å¼ç Key å¯ä»¥éå¤ï¼å¦æç»å ¶å®å段åå»ºè¾ å©ç´¢å¼ï¼å ¶ç»æå¾å¦ä¸ï¼
æ ¹æ®ä¸é¢ä¸¤å¼ å¾ï¼é¦å æç § B+ Tree æç´¢ç®æ³æç´¢ç´¢å¼ï¼å¦ææå®ç Key åå¨ï¼åååºå ¶ Data åçå¼ï¼ç¶å以 Data åçå¼ä¸ºå°åï¼è¯»åç¸åºæ°æ®è®°å½ã
å¯ä»¥çå°ï¼MyISAM åå¨å¼æï¼ç´¢å¼ç»æå¶åèç¹åå¨å ³é®ååæ°æ®å°åï¼ä¹å°±æ¯è¯´ç´¢å¼å ³é®ååæ°æ®æ²¡æå¨ä¸èµ·åæ¾ï¼ä½ç°å¨ç£çä¸ï¼å°±æ¯ç´¢å¼å¨ä¸ä¸ªæä»¶åå¨ï¼æ°æ®å¨å¦ä¸ä¸ªæä»¶åå¨ï¼ä¾å¦ä¸ä¸ª user 表ï¼ä¼å¨ç£çä¸åå¨ä¸ºä¸ä¸ªæä»¶ï¼
- user.frmï¼è¡¨ç»ææä»¶ï¼
- user.MYDï¼è¡¨çæ°æ®æä»¶ï¼
- user.MYIï¼è¡¨çç´¢å¼æä»¶ï¼
MyISAM çç´¢å¼æ¹å¼ä¹å«åéèéç´¢å¼ã
InnoDB
å¨ InnoDB åå¨å¼æç主é®ç´¢å¼æ çå¶åèç¹ä¸ï¼ç´¢å¼å ³é®ååæ°æ®æ¯å¨ä¸èµ·åæ¾çï¼å ¶ç»æå¦å¾æç¤ºï¼
å¯¹äº InnoDB çè¾ å©ç´¢å¼æ èè¨ï¼å ¶å¶åèç¹ä¸åæ¾çæ¯ç´¢å¼å ³é®åå对åºç主é®ï¼å ¶ç»æå¦å¾æç¤ºï¼
å¨è¾ å©ç´¢å¼ç B+ æ ä¸ï¼ä¼å æ ¹æ®å ³é®åæ¾å°å¯¹åºç主é®ï¼ç¶ååå»ä¸»é®ç´¢å¼æ 䏿¾å°å¯¹åºçè¡è®°å½æ°æ®ãä»ç´¢å¼æ ä¸å¯ä»¥çå°ï¼InnoDB çç´¢å¼å ³é®ååæ°æ®é½æ¯å¨ä¸èµ·åæ¾çï¼ä½ç°å¨ç£çåå¨ä¸ï¼ä¾å¦å建ä¸ä¸ª user 表ï¼å¨ç£çä¸åªåå¨ä¸¤ç§æä»¶ï¼
- user.frmï¼åå¨è¡¨çç»æï¼
- user.ibdï¼åå¨ç´¢å¼åæ°æ®ï¼
InnoDB çç´¢å¼æ å¶èç¹å å«äºå®æ´çæ°æ®è®°å½ï¼è¿ç§ç´¢å¼å«åèéç´¢å¼ãå 为 InnoDB çæ°æ®æä»¶æ¬èº«è¦æä¸»é®èéï¼æä»¥ InnoDB è¦æ±è¡¨å¿ é¡»æä¸»é®ï¼åºå«äºMyISAMå¯ä»¥æ²¡æï¼ï¼å¦ææ²¡ææ¾å¼æå®ï¼å MySQL ç³»ç»ä¼èªå¨éæ©ä¸ä¸ªå¯ä»¥å¯ä¸æ è¯æ°æ®è®°å½çåä½ä¸ºä¸»é®ï¼å¦æä¸åå¨è¿ç§åï¼å MySQL èªå¨ä¸º InnoDB 表çæä¸ä¸ªéå«å段ä½ä¸ºä¸»é®ï¼è¿ä¸ªå段é¿åº¦ä¸º 6 个åèï¼ç±»åä¸ºé¿æ´å½¢ã
èªéåºåå¸ç´¢å¼
å¯¹äº InnoDB åå¨å¼ææ¥è¯´ï¼å¦æå®æ£æµå°åä¸ä¸ªäºçº§ç´¢å¼æ ä¸æè¢«ä½¿ç¨ï¼é£ä¹è¯¥å¼æä¼å¨å å䏿 ¹æ®äºçº§ç´¢å¼æ ä¸çäºçº§ç´¢å¼å¼ï¼å¨å åä¸æå»ºä¸ä¸ªåå¸è¡¨ï¼ä»¥æ¤æ¥åå°åè¡¨çæ¬¡æ°ä»¥å éæç´¢ã
注æï¼èªéåºåå¸ç´¢å¼æ¬èº«çæ°æ®ç»´æ¤ä¹æ¯éè¦èè´¹æ§è½çï¼å¹¶ä¸æ¯è¯´èªéåºåå¸ç´¢å¼å¨ä»»ä½æ åµä¸é½ä¼æåäºçº§ç´¢å¼çæ¥è¯¢æ§è½ã
宿¹ææ¡£çè§£éå¦ä¸ï¼
In MySQL 5.7, the adaptive hash index search system is partitioned. Each index is bound to a specific partition, and each partition is protected by a separate latch. Partitioning is controlled by the innodb_adaptive_hash_index_parts configuration option. In earlier releases, the adaptive hash index search system was protected by a single latch which could become a point of contention under heavy workloads. The innodb_adaptive_hash_index_parts option is set to 8 by default. The maximum setting is 512. The hash index is always built based on an existing B-tree index on the table. InnoDB can build a hash index on a prefix of any length of the key defined for the B-tree, depending on the pattern of searches that InnoDB observes for the B-tree index. A hash index can be partial, covering only those pages of the index that are often accessed. You can monitor the use of the adaptive hash index and the contention for its use in the SEMAPHORES section of the output of the SHOW ENGINE INNODB STATUS command. If you see many threads waiting on an RW-latch created in btr0sea.c, then it might be useful to disable adaptive hash indexing.
ç®åæ¥è¯´ï¼å°±æ¯å¨ MySQL 5.7 çæ¬åï¼èªéåºåå¸ç´¢å¼æç´¢ç³»ç»ä¼è¢«ååºï¼å¨é»è®¤æ åµä¸ï¼èªéåºåå¸ç´¢å¼æç´¢ç³»ç»æ¯å¼å¯çï¼ç± innodb_adaptive_hash_index å鿥è¿è¡æ§å¶ãå¨é»è®¤æ åµä¸ä¼æ 8 个ååºï¼ç± innodb_adaptive_hash_index_part å鿥è¿è¡æ§å¶ï¼æå¤§å¼ä¸º 512ã
卿¯ä¸ªååºä¸é½ä¼æä¸ä¸ªåç¬ç鿥æ§å¶å¹¶åæä½ï¼èå¨ 5.7 çæ¬ä¹åï¼åªä½¿ç¨äºä¸ä¸ªéæ¥ä¿æ¤æ´ä¸ªåå¸ç´¢å¼æç´¢ç³»ç»ï¼è¿ä¼æä¸ºç³»ç»çç¶é¢æå¨ã
æ¤å¤ï¼åå¸ç´¢å¼å¯è½åªæå»ºäºé¨åå åï¼ä» ä» å æ¬é£äºç»å¸¸è®¿é®å°ç页é¢ã妿åå¸ç´¢å¼æç´¢ç³»ç»æä¸ºäºç³»ç»çç¶é¢ï¼é£ä¹å°±å¯ä»¥èèå°å ¶å ³éèæé«æ§è½ã
åæï¼https://www.cnblogs.com/tuilk/p/16877127.html