ç´¢å¼åç
è¿é主è¦è®¨è®ºä¸ä¸ 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