2023ææ°é¢è¯æ´çï¼æ¶µçå端ææç¥è¯ç¹ï¼è¿å¨æç»æ´æ°ä¸
é¢è¯èµæåéï¼https://gitee.com/drewbro/InterviewQuestions
1. ä»ä¹æ¯å ³ç³»åæ°æ®åºï¼
顾åæä¹ï¼å ³ç³»åæ°æ®åºï¼RDBMSï¼Relational Database Management Systemï¼å°±æ¯ä¸ç§å»ºç«å¨å ³ç³»æ¨¡åçåºç¡ä¸çæ°æ®åºãå ³ç³»æ¨¡å表æäºæ°æ®åºä¸æåå¨çæ°æ®ä¹é´çèç³»ï¼ä¸å¯¹ä¸ãä¸å¯¹å¤ãå¤å¯¹å¤ï¼ã
å ³ç³»åæ°æ®åºä¸ï¼æä»¬çæ°æ®é½è¢«åæ¾å¨äºåç§è¡¨ä¸ï¼æ¯å¦ç¨æ·è¡¨ï¼ï¼è¡¨ä¸çæ¯ä¸è¡å°±åæ¾ç䏿¡æ°æ®ï¼æ¯å¦ä¸ä¸ªç¨æ·çä¿¡æ¯ï¼ã
大é¨åå ³ç³»åæ°æ®åºé½ä½¿ç¨ SQL æ¥æä½æ°æ®åºä¸çæ°æ®ãå¹¶ä¸ï¼å¤§é¨åå ³ç³»åæ°æ®åºé½æ¯æäºå¡çåå¤§ç¹æ§(ACID)ã
æåªäºå¸¸è§çå ³ç³»åæ°æ®åºå¢ï¼
MySQLãPostgreSQLãOracleãSQL ServerãSQLiteï¼å¾®ä¿¡æ¬å°çè天记å½çåå¨å°±æ¯ç¨ç SQLiteï¼ ......ã
2. ä»ä¹æ¯ SQLï¼
SQL æ¯ä¸ç§ç»æåæ¥è¯¢è¯è¨(Structured Query Language)ï¼ä¸é¨ç¨æ¥ä¸æ°æ®åºæäº¤éï¼ç®çæ¯æä¾ä¸ç§ä»æ°æ®åºä¸è¯»åæ°æ®çç®åææçæ¹æ³ã
å 乿æç主æµå ³ç³»æ°æ®åºé½æ¯æ SQL ï¼éç¨æ§é常强ãå¹¶ä¸ï¼ä¸äºéå ³ç³»åæ°æ®åºä¹å ¼å®¹ SQL æè 使ç¨çæ¯ç±»ä¼¼äº SQL çæ¥è¯¢è¯è¨ã
SQL å¯ä»¥å¸®å©æä»¬ï¼
- æ°å»ºæ°æ®åºãæ°æ®è¡¨ãåæ®µï¼
- 卿°æ®åºä¸å¢å ï¼å é¤ï¼ä¿®æ¹ï¼æ¥è¯¢æ°æ®ï¼
- æ°å»ºè§å¾ã彿°ãåå¨è¿ç¨ï¼
- å¯¹æ°æ®åºä¸çæ°æ®è¿è¡ç®åçæ°æ®åæï¼
- æé Hiveï¼Spark SQL åå¤§æ°æ®ï¼
- æé SQLFlow åæºå¨å¦ä¹ ï¼
- ......
ä»ä¹æ¯ MySQLï¼
MySQL æ¯ä¸ç§å ³ç³»åæ°æ®åºï¼ä¸»è¦ç¨äºæä¹ åå卿们çç³»ç»ä¸çä¸äºæ°æ®æ¯å¦ç¨æ·ä¿¡æ¯ã
ç±äº MySQL æ¯å¼æºå è´¹å¹¶ä¸æ¯è¾æççæ°æ®åºï¼å æ¤ï¼MySQL 被大é使ç¨å¨åç§ç³»ç»ä¸ãä»»ä½äººé½å¯ä»¥å¨ GPL(General Public License) ç许å¯ä¸ä¸è½½å¹¶æ ¹æ®ä¸ªæ§åçéè¦å¯¹å ¶è¿è¡ä¿®æ¹ãMySQL çé»è®¤ç«¯å£å·æ¯3306ã
3. MySQL æä»ä¹ä¼ç¹ï¼
è¿ä¸ªé®é¢æ¬è´¨ä¸æ¯å¨é® MySQL 妿¤æµè¡çåå ã
MySQL 主è¦å ·æä¸é¢è¿äºä¼ç¹ï¼
- æç稳å®ï¼åè½å®åã
- 弿ºå è´¹ã
- ææ¡£ä¸°å¯ï¼æ¢æè¯¦ç»ç宿¹ææ¡£ï¼åæé常å¤ä¼è´¨æç« å¯ä¾åèå¦ä¹ ã
- å¼ç®±å³ç¨ï¼æä½ç®åï¼ç»´æ¤ææ¬ä½ã
- å ¼å®¹æ§å¥½ï¼æ¯æå¸¸è§çæä½ç³»ç»ï¼æ¯æå¤ç§å¼åè¯è¨ã
- ç¤¾åºæ´»è·ï¼çæå®åã
- äºå¡æ¯æä¼ç§ï¼ InnoDB åå¨å¼æé»è®¤ä½¿ç¨ REPEATABLE-READ å¹¶ä¸ä¼æä»»ä½æ§è½æå¤±ï¼å¹¶ä¸ï¼InnoDB å®ç°ç REPEATABLE-READ é离级å«å ¶å®æ¯å¯ä»¥è§£å³å¹»è¯»é®é¢åççã
- æ¯æååºå表ã读åå离ãé«å¯ç¨ã
MySQL åºç¡æ¶æ
建议é å SQL è¯å¥å¨ MySQL ä¸çæ§è¡è¿ç¨ è¿ç¯æç« æ¥çè§£ MySQL åºç¡æ¶æãå¦å¤ï¼âä¸ä¸ª SQL è¯å¥å¨ MySQL ä¸çæ§è¡æµç¨â乿¯é¢è¯ä¸æ¯è¾å¸¸é®çä¸ä¸ªé®é¢ã
ä¸å¾æ¯ MySQL çä¸ä¸ªç®è¦æ¶æå¾ï¼ä»ä¸å¾ä½ å¯ä»¥å¾æ¸ æ°ççå°å®¢æ·ç«¯ç䏿¡ SQL è¯å¥å¨ MySQL å 鍿¯å¦ä½æ§è¡çã
ä»ä¸å¾å¯ä»¥çåºï¼ MySQL 主è¦ç±ä¸é¢å é¨åææï¼
- è¿æ¥å¨ï¼ 身份认è¯åæéç¸å ³(ç»å½ MySQL çæ¶å)ã
- æ¥è¯¢ç¼åï¼ æ§è¡æ¥è¯¢è¯å¥çæ¶åï¼ä¼å æ¥è¯¢ç¼åï¼MySQL 8.0 çæ¬åç§»é¤ï¼å 为è¿ä¸ªåè½ä¸å¤ªå®ç¨ï¼ã
- åæå¨ï¼ 没æå½ä¸ç¼åçè¯ï¼SQL è¯å¥å°±ä¼ç»è¿åæå¨ï¼åæå¨è¯´ç½äºå°±æ¯è¦å çä½ ç SQL è¯å¥è¦å¹²åï¼åæ£æ¥ä½ ç SQL è¯å¥è¯æ³æ¯å¦æ£ç¡®ã
- ä¼åå¨ï¼ æç § MySQL 认为æä¼çæ¹æ¡å»æ§è¡ã
- æ§è¡å¨ï¼ æ§è¡è¯å¥ï¼ç¶åä»åå¨å¼æè¿åæ°æ®ã æ§è¡è¯å¥ä¹åä¼å 夿æ¯å¦ææéï¼å¦ææ²¡ææéçè¯ï¼å°±ä¼æ¥éã
- æä»¶å¼åå¨å¼æ ï¼ ä¸»è¦è´è´£æ°æ®çåå¨å读åï¼éç¨çæ¯æä»¶å¼æ¶æï¼æ¯æ InnoDBãMyISAMãMemory çå¤ç§åå¨å¼æã
MySQL åå¨å¼æ
MySQL æ ¸å¿å¨äºåå¨å¼æï¼æ³è¦æ·±å ¥å¦ä¹ MySQLï¼å¿ å®è¦æ·±å ¥ç ç©¶ MySQL åå¨å¼æã
4. MySQL æ¯æåªäºåå¨å¼æï¼é»è®¤ä½¿ç¨åªä¸ªï¼
MySQL æ¯æå¤ç§åå¨å¼æï¼ä½ å¯ä»¥éè¿ show engines å½ä»¤æ¥æ¥ç MySQL æ¯æçææåå¨å¼æã
ä»ä¸å¾æä»¬å¯ä»¥æ¥çåºï¼ MySQL å½åé»è®¤çåå¨å¼ææ¯ InnoDBãå¹¶ä¸ï¼ææçåå¨å¼æä¸åªæ InnoDB æ¯äºå¡æ§åå¨å¼æï¼ä¹å°±æ¯è¯´åªæ InnoDB æ¯æäºå¡ã
æè¿é使ç¨ç MySQL çæ¬æ¯ 8.xï¼ä¸åç MySQL çæ¬ä¹é´å¯è½ä¼æå·®å«ã
MySQL 5.5.5 ä¹åï¼MyISAM æ¯ MySQL çé»è®¤åå¨å¼æã5.5.5 çæ¬ä¹åï¼InnoDB æ¯ MySQL çé»è®¤åå¨å¼æã
ä½ å¯ä»¥éè¿ select version() å½ä»¤æ¥çä½ ç MySQL çæ¬ã
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.27 |
+-----------+
1 row in set (0.00 sec)
ä½ ä¹å¯ä»¥éè¿ show variables like '%storage_engine%' å½ä»¤ç´æ¥æ¥ç MySQL å½åé»è®¤çåå¨å¼æã
å¦æä½ åªæ³æ¥çæ°æ®åºä¸æä¸ªè¡¨ä½¿ç¨çåå¨å¼æçè¯ï¼å¯ä»¥ä½¿ç¨ show table status from db_name where name='table_name'å½ä»¤ã
å¦æä½ æ³è¦æ·±å ¥äºè§£æ¯ä¸ªåå¨å¼æä»¥åå®ä»¬ä¹é´çåºå«ï¼æ¨èä½ å»é è¯»ä»¥ä¸ MySQL 宿¹ææ¡£å¯¹åºçä»ç»(é¢è¯ä¸ä¼é®è¿ä¹ç»ï¼äºè§£å³å¯)ï¼
- InnoDB åå¨å¼æè¯¦ç»ä»ç»ï¼https://dev.mysql.com/doc/refman/8.0/en/innodb-storage-engine.html ã
- å ¶ä»åå¨å¼æè¯¦ç»ä»ç»ï¼https://dev.mysql.com/doc/refman/8.0/en/storage-engines.html ã
5. MySQL åå¨å¼ææ¶æäºè§£åï¼
MySQL åå¨å¼æéç¨çæ¯ æä»¶å¼æ¶æ ï¼æ¯æå¤ç§åå¨å¼æï¼æä»¬çè³å¯ä»¥ä¸ºä¸åçæ°æ®åºè¡¨è®¾ç½®ä¸åçåå¨å¼æä»¥éåºä¸ååºæ¯çéè¦ãåå¨å¼ææ¯åºäºè¡¨çï¼è䏿¯æ°æ®åºã
å¹¶ä¸ï¼ä½ è¿å¯ä»¥æ ¹æ® MySQL å®ä¹çåå¨å¼æå®ç°æ 忥壿¥ç¼åä¸ä¸ªå±äºèªå·±çåå¨å¼æãè¿äºé宿¹æä¾çåå¨å¼æå¯ä»¥ç§°ä¸ºç¬¬ä¸æ¹åå¨å¼æï¼åºå«äºå®æ¹åå¨å¼æãåç®åæå¸¸ç¨ç InnoDB å ¶å®åå¼å§å°±æ¯ä¸ä¸ªç¬¬ä¸æ¹åå¨å¼æï¼åé¢ç±äºè¿äºä¼ç§ï¼å ¶è¢« Oracle ç´æ¥æ¶è´äºã
MySQL 宿¹ææ¡£ä¹æä»ç»å°å¦ä½ç¼åä¸ä¸ªèªå®ä¹åå¨å¼æï¼å°åï¼https://dev.mysql.com/doc/internals/en/custom-engine.html ã
6. MyISAM å InnoDB æä»ä¹åºå«ï¼
MySQL 5.5 ä¹åï¼MyISAM å¼ææ¯ MySQL çé»è®¤åå¨å¼æï¼å¯è°æ¯é£å 䏿¶ã
è½ç¶ï¼MyISAM çæ§è½è¿è¡ï¼åç§ç¹æ§ä¹è¿ä¸éï¼æ¯å¦å ¨æç´¢å¼ãå缩ã空é´å½æ°çï¼ã使¯ï¼MyISAM 䏿¯æäºå¡åè¡çº§éï¼è䏿大ç缺é·å°±æ¯å´©æºåæ æ³å®å ¨æ¢å¤ã
MySQL 5.5 çæ¬ä¹åï¼InnoDB æ¯ MySQL çé»è®¤åå¨å¼æã
è¨å½æ£ä¼ ï¼å±ä»¬ä¸é¢è¿æ¯æ¥ç®å对æ¯ä¸ä¸ä¸¤è ï¼
1.æ¯å¦æ¯æè¡çº§é
MyISAM åªæè¡¨çº§é(table-level locking)ï¼è InnoDB æ¯æè¡çº§é(row-level locking)å表级é,é»è®¤ä¸ºè¡çº§éã
ä¹å°±è¯´ï¼MyISAM ä¸éå°±æ¯éä½äºæ´å¼ 表ï¼è¿å¨å¹¶ååçæ åµä¸æ¯å¤ä¹æ»´æ¨æ¨åï¼è¿ä¹æ¯ä¸ºä»ä¹ InnoDB å¨å¹¶ååçæ¶åï¼æ§è½æ´çç®äºï¼
2.æ¯å¦æ¯æäºå¡
MyISAM 䏿ä¾äºå¡æ¯æã
InnoDB æä¾äºå¡æ¯æï¼å®ç°äº SQL æ åå®ä¹äºå个é离级å«ï¼å ·ææäº¤(commit)ååæ»(rollback)äºå¡çè½åãå¹¶ä¸ï¼InnoDB é»è®¤ä½¿ç¨ç REPEATABLE-READï¼å¯é读ï¼éç¦»çº§å«æ¯å¯ä»¥è§£å³å¹»è¯»é®é¢åççï¼åºäº MVCC å Next-Key Lockï¼ã
3.æ¯å¦æ¯æå¤é®
MyISAM 䏿¯æï¼è InnoDB æ¯æã
å¤é®å¯¹äºç»´æ¤æ°æ®ä¸è´æ§é常æå¸®å©ï¼ä½æ¯å¯¹æ§è½æä¸å®çæèãå æ¤ï¼é常æ åµä¸ï¼æä»¬æ¯ä¸å»ºè®®å¨å®é ç产项ç®ä¸ä½¿ç¨å¤é®çï¼å¨ä¸å¡ä»£ç ä¸è¿è¡çº¦æå³å¯ï¼
é¿éçãJava å¼åæåã乿¯æç¡®è§å®ç¦æ¢ä½¿ç¨å¤é®çã
ä¸è¿ï¼å¨ä»£ç ä¸è¿è¡çº¦æçè¯ï¼å¯¹ç¨åºåçè½åè¦æ±æ´é«ï¼å ·ä½æ¯å¦è¦éç¨å¤é®è¿æ¯è¦æ ¹æ®ä½ ç项ç®å®é æ åµèå®ã
æ»ç»ï¼ä¸è¬æä»¬ä¹æ¯ä¸å»ºè®®å¨æ°æ®åºå±é¢ä½¿ç¨å¤é®çï¼åºç¨å±é¢å¯ä»¥è§£å³ãä¸è¿ï¼è¿æ ·ä¼å¯¹æ°æ®çä¸è´æ§é æå¨èãå ·ä½è¦ä¸è¦ä½¿ç¨å¤é®è¿æ¯è¦æ ¹æ®ä½ çé¡¹ç®æ¥å³å®ã
4.æ¯å¦æ¯ææ°æ®åºå¼å¸¸å´©æºåçå®å ¨æ¢å¤
MyISAM 䏿¯æï¼è InnoDB æ¯æã
ä½¿ç¨ InnoDB çæ°æ®åºå¨å¼å¸¸å´©æºåï¼æ°æ®åºéæ°å¯å¨çæ¶åä¼ä¿è¯æ°æ®åºæ¢å¤å°å´©æºåçç¶æãè¿ä¸ªæ¢å¤çè¿ç¨ä¾èµäº redo log ã
5.æ¯å¦æ¯æ MVCC
MyISAM 䏿¯æï¼è InnoDB æ¯æã
讲çï¼è¿ä¸ªå¯¹æ¯æç¹åºè¯ï¼æ¯ç« MyISAM è¿è¡çº§éé½ä¸æ¯æãMVCC å¯ä»¥ç使¯è¡çº§éçä¸ä¸ªå级ï¼å¯ä»¥ææåå°å éæä½ï¼æé«æ§è½ã
6.ç´¢å¼å®ç°ä¸ä¸æ ·ã
è½ç¶ MyISAM 弿å InnoDB 弿齿¯ä½¿ç¨ B+Tree ä½ä¸ºç´¢å¼ç»æï¼ä½æ¯ä¸¤è çå®ç°æ¹å¼ä¸å¤ªä¸æ ·ã
InnoDB 弿ä¸ï¼å ¶æ°æ®æä»¶æ¬èº«å°±æ¯ç´¢å¼æä»¶ãç¸æ¯ MyISAMï¼ç´¢å¼æä»¶åæ°æ®æä»¶æ¯å离çï¼å ¶è¡¨æ°æ®æä»¶æ¬èº«å°±æ¯æ B+Tree ç»ç»çä¸ä¸ªç´¢å¼ç»æï¼æ çå¶èç¹ data åä¿åäºå®æ´çæ°æ®è®°å½ã
7.æ§è½æå·®å«ã
InnoDB çæ§è½æ¯ MyISAM æ´å¼ºå¤§ï¼ä¸ç®¡æ¯å¨è¯»åæ··åæ¨¡å¼ä¸è¿æ¯åªè¯»æ¨¡å¼ä¸ï¼éç CPU æ ¸æ°çå¢å ï¼InnoDB ç读åè½åå线æ§å¢é¿ãMyISAM å 为读åä¸è½å¹¶åï¼å®çå¤çè½åè·æ ¸æ°æ²¡å ³ç³»ã
æ»ç» ï¼
- InnoDB æ¯æè¡çº§å«çéç²åº¦ï¼MyISAM 䏿¯æï¼åªæ¯æè¡¨çº§å«çéç²åº¦ã
- MyISAM 䏿ä¾äºå¡æ¯æãInnoDB æä¾äºå¡æ¯æï¼å®ç°äº SQL æ åå®ä¹äºå个é离级å«ã
- MyISAM 䏿¯æå¤é®ï¼è InnoDB æ¯æã
- MyISAM 䏿¯æ MVVCï¼è InnoDB æ¯æã
- è½ç¶ MyISAM 弿å InnoDB 弿齿¯ä½¿ç¨ B+Tree ä½ä¸ºç´¢å¼ç»æï¼ä½æ¯ä¸¤è çå®ç°æ¹å¼ä¸å¤ªä¸æ ·ã
- MyISAM 䏿¯ææ°æ®åºå¼å¸¸å´©æºåçå®å ¨æ¢å¤ï¼è InnoDB æ¯æã
- InnoDB çæ§è½æ¯ MyISAM æ´å¼ºå¤§ã
7. MyISAM å InnoDB å¦ä½éæ©ï¼
大夿°æ¶åæä»¬ä½¿ç¨ç齿¯ InnoDB åå¨å¼æï¼å¨æäºè¯»å¯éçæ åµä¸ï¼ä½¿ç¨ MyISAM 乿¯åéçãä¸è¿ï¼åææ¯ä½ ç项ç®ä¸ä»æ MyISAM 䏿¯æäºå¡ãå´©æºæ¢å¤ç缺ç¹ï¼å¯æ¯~æä»¬ä¸è¬é½ä¼ä»æåï¼ï¼ã
ãMySQL 髿§è½ãä¸é¢æä¸å¥è¯è¿æ ·åå°:
ä¸è¦è½»æç¸ä¿¡âMyISAM æ¯ InnoDB å¿«âä¹ç±»çç»éªä¹è°ï¼è¿ä¸ªç»è®ºå¾å¾ä¸æ¯ç»å¯¹çãå¨å¾å¤æä»¬å·²ç¥åºæ¯ä¸ï¼InnoDB çé度é½å¯ä»¥è®© MyISAM æå°è«åï¼å°¤å ¶æ¯ç¨å°äºèç°ç´¢å¼ï¼æè éè¦è®¿é®çæ°æ®é½å¯ä»¥æ¾å ¥å åçåºç¨ã
ä¸è¬æ åµä¸æä»¬éæ© InnoDB 齿¯æ²¡æé®é¢çï¼ä½æ¯æäºæ åµä¸ä½ å¹¶ä¸å¨ä¹å¯æ©å±è½ååå¹¶åè½åï¼ä¹ä¸éè¦äºå¡æ¯æï¼ä¹ä¸å¨ä¹å´©æºåçå®å ¨æ¢å¤é®é¢çè¯ï¼éæ© MyISAM 乿¯ä¸ä¸ªä¸éçéæ©ã使¯ä¸è¬æ åµä¸ï¼æä»¬é½æ¯éè¦èèå°è¿äºé®é¢çã
å æ¤ï¼å¯¹äºå±ä»¬æ¥å¸¸å¼åçä¸å¡ç³»ç»æ¥è¯´ï¼ä½ å 乿¾ä¸å°ä»ä¹çç±åä½¿ç¨ MyISAM ä½ä¸ºèªå·±ç MySQL æ°æ®åºçåå¨å¼æã
MySQL ç´¢å¼
MySQL æ¥è¯¢ç¼å
æ§è¡æ¥è¯¢è¯å¥çæ¶åï¼ä¼å æ¥è¯¢ç¼åãä¸è¿ï¼MySQL 8.0 çæ¬åç§»é¤ï¼å 为è¿ä¸ªåè½ä¸å¤ªå®ç¨
my.cnf å å ¥ä»¥ä¸é ç½®ï¼éå¯ MySQL å¼å¯æ¥è¯¢ç¼å
query_cache_type=1
query_cache_size=600000
MySQL æ§è¡ä»¥ä¸å½ä»¤ä¹å¯ä»¥å¼å¯æ¥è¯¢ç¼å
set global query_cache_type=1;
set global query_cache_size=600000;
å¦ä¸ï¼å¼å¯æ¥è¯¢ç¼ååå¨åæ ·çæ¥è¯¢æ¡ä»¶ä»¥åæ°æ®æ åµä¸ï¼ä¼ç´æ¥å¨ç¼åä¸è¿åç»æãè¿éçæ¥è¯¢æ¡ä»¶å æ¬æ¥è¯¢æ¬èº«ãå½åè¦æ¥è¯¢çæ°æ®åºã客æ·ç«¯åè®®çæ¬å·çä¸äºå¯è½å½±åç»æçä¿¡æ¯ã
æ¥è¯¢ç¼åä¸å½ä¸çæ åµï¼
- ä»»ä½ä¸¤ä¸ªæ¥è¯¢å¨ä»»ä½å符ä¸çä¸åé½ä¼å¯¼è´ç¼åä¸å½ä¸ã
- 妿æ¥è¯¢ä¸å å«ä»»ä½ç¨æ·èªå®ä¹å½æ°ãåå¨å½æ°ãç¨æ·åéã临æ¶è¡¨ãMySQL åºä¸çç³»ç»è¡¨ï¼å ¶æ¥è¯¢ç»æä¹ä¸ä¼è¢«ç¼åã
- ç¼å建ç«ä¹åï¼MySQL çæ¥è¯¢ç¼åç³»ç»ä¼è·è¸ªæ¥è¯¢ä¸æ¶åçæ¯å¼ è¡¨ï¼å¦æè¿äºè¡¨ï¼æ°æ®æç»æï¼åçååï¼é£ä¹åè¿å¼ 表ç¸å ³çææç¼åæ°æ®é½å°å¤±æã
ç¼åè½ç¶è½å¤æåæ°æ®åºçæ¥è¯¢æ§è½ï¼ä½æ¯ç¼ååæ¶ä¹å¸¦æ¥äºé¢å¤çå¼éï¼æ¯æ¬¡æ¥è¯¢åé½è¦å䏿¬¡ç¼åæä½ï¼å¤±æåè¿è¦éæ¯ã å æ¤ï¼å¼å¯æ¥è¯¢ç¼åè¦è°¨æ ï¼å°¤å ¶å¯¹äºåå¯éçåºç¨æ¥è¯´æ´æ¯å¦æ¤ã妿å¼å¯ï¼è¦æ³¨æåçæ§å¶ç¼å空é´å¤§å°ï¼ä¸è¬æ¥è¯´å ¶å¤§å°è®¾ç½®ä¸ºå å MB æ¯è¾åéãæ¤å¤ï¼è¿å¯ä»¥éè¿ sql_cache å sql_no_cache æ¥æ§å¶æä¸ªæ¥è¯¢è¯å¥æ¯å¦éè¦ç¼åï¼
select sql_no_cache count(*) from usr;
MySQL æ¥å¿
- MySQL ä¸å¸¸è§çæ¥å¿æåªäºï¼
- æ ¢æ¥è¯¢æ¥å¿æä»ä¹ç¨ï¼
- binlog 主è¦è®°å½äºä»ä¹ï¼
- redo log å¦ä½ä¿è¯äºå¡çæä¹ æ§ï¼
- 页修æ¹ä¹å为ä»ä¹ä¸ç´æ¥å·çå¢ï¼
- binlog å redolog æä»ä¹åºå«ï¼
- undo log å¦ä½ä¿è¯äºå¡çååæ§ï¼
- ......
MySQL äºå¡
8. ä½è°äºå¡ï¼
æä»¬è®¾æ³ä¸ä¸ªåºæ¯ï¼è¿ä¸ªåºæ¯ä¸æä»¬éè¦æå ¥å¤æ¡ç¸å ³èçæ°æ®å°æ°æ®åºï¼ä¸å¹¸çæ¯ï¼è¿ä¸ªè¿ç¨å¯è½ä¼éå°ä¸é¢è¿äºé®é¢ï¼
- æ°æ®åºä¸éçªç¶å 为æäºåå ææäºã
- 客æ·ç«¯çªç¶å 为ç½ç»åå è¿æ¥ä¸ä¸æ°æ®åºäºã
- å¹¶åè®¿é®æ°æ®åºæ¶ï¼å¤ä¸ªçº¿ç¨åæ¶åå ¥æ°æ®åºï¼è¦çäºå½¼æ¤çæ´æ¹ã
- ......
ä¸é¢çä»»ä½ä¸ä¸ªé®é¢é½å¯è½ä¼å¯¼è´æ°æ®çä¸ä¸è´æ§ã为äºä¿è¯æ°æ®çä¸è´æ§ï¼ç³»ç»å¿ é¡»è½å¤å¤çè¿äºé®é¢ãäºå¡å°±æ¯æä»¬æ½è±¡åºæ¥ç®åè¿äºé®é¢çé¦éæºå¶ãäºå¡çæ¦å¿µèµ·æºäºæ°æ®åºï¼ç®åï¼å·²ç»æä¸ºä¸ä¸ªæ¯è¾å¹¿æ³çæ¦å¿µã
ä½ä¸ºäºå¡ï¼ ä¸è¨è½ä¹ï¼äºå¡æ¯é»è¾ä¸çä¸ç»æä½ï¼è¦ä¹é½æ§è¡ï¼è¦ä¹é½ä¸æ§è¡ã
äºå¡æç»å ¸ä¹ç»å¸¸è¢«æ¿åºæ¥è¯´ä¾åå°±æ¯è½¬è´¦äºãåå¦å°æè¦ç»å°çº¢è½¬è´¦ 1000 å ï¼è¿ä¸ªè½¬è´¦ä¼æ¶åå°ä¸¤ä¸ªå ³é®æä½ï¼è¿ä¸¤ä¸ªæä½å¿ 须齿åæè é½å¤±è´¥ã
- å°å°æçä½é¢åå° 1000 å
- å°å°çº¢çä½é¢å¢å 1000 å ã
äºå¡ä¼æè¿ä¸¤ä¸ªæä½å°±å¯ä»¥çæé»è¾ä¸çä¸ä¸ªæ´ä½ï¼è¿ä¸ªæ´ä½å å«çæä½è¦ä¹é½æåï¼è¦ä¹é½è¦å¤±è´¥ãè¿æ ·å°±ä¸ä¼åºç°å°æä½é¢åå°èå°çº¢çä½é¢å´å¹¶æ²¡æå¢å çæ åµã
ä½è°æ°æ®åºäºå¡ï¼
大夿°æ åµä¸ï¼æä»¬å¨è°è®ºäºå¡çæ¶åï¼å¦ææ²¡æç¹æåå¸å¼äºå¡ï¼å¾å¾æçå°±æ¯æ°æ®åºäºå¡ã
æ°æ®åºäºå¡å¨æä»¬æ¥å¸¸å¼å䏿¥è§¦çæå¤äºãå¦æä½ ç项ç®å±äºå使¶æçè¯ï¼ä½ æ¥è§¦å°çå¾å¾å°±æ¯æ°æ®åºäºå¡äºã
飿°æ®åºäºå¡æä»ä¹ä½ç¨å¢ï¼
ç®åæ¥è¯´ï¼æ°æ®åºäºå¡å¯ä»¥ä¿è¯å¤ä¸ªå¯¹æ°æ®åºçæä½ï¼ä¹å°±æ¯ SQL è¯å¥ï¼ææä¸ä¸ªé»è¾ä¸çæ´ä½ãææè¿ä¸ªé»è¾ä¸çæ´ä½çè¿äºæ°æ®åºæä½éµå¾ªï¼è¦ä¹å ¨é¨æ§è¡æå,è¦ä¹å ¨é¨ä¸æ§è¡ ã
# å¼å¯ä¸ä¸ªäºå¡
START TRANSACTION;
# 夿¡ SQL è¯å¥
SQL1,SQL2...
## æäº¤äºå¡
COMMIT;
å¦å¤ï¼å ³ç³»åæ°æ®åºï¼ä¾å¦ï¼MySQLãSQL ServerãOracle çï¼äºå¡é½æ ACID ç¹æ§ï¼
- ååæ§ï¼Atomicityï¼ ï¼ äºå¡æ¯æå°çæ§è¡åä½ï¼ä¸å 许åå²ãäºå¡çååæ§ç¡®ä¿å¨ä½è¦ä¹å ¨é¨å®æï¼è¦ä¹å®å ¨ä¸èµ·ä½ç¨ï¼
- ä¸è´æ§ï¼Consistencyï¼ï¼ æ§è¡äºå¡ååï¼æ°æ®ä¿æä¸è´ï¼ä¾å¦è½¬è´¦ä¸å¡ä¸ï¼æ 论äºå¡æ¯å¦æåï¼è½¬è´¦è åæ¶æ¬¾äººçæ»é¢åºè¯¥æ¯ä¸åçï¼
- é离æ§ï¼Isolationï¼ï¼ å¹¶åè®¿é®æ°æ®åºæ¶ï¼ä¸ä¸ªç¨æ·çäºå¡ä¸è¢«å ¶ä»äºå¡æå¹²æ°ï¼åå¹¶åäºå¡ä¹é´æ°æ®åºæ¯ç¬ç«çï¼
- æä¹ æ§ï¼Durabilityï¼ï¼ ä¸ä¸ªäºå¡è¢«æäº¤ä¹åãå®å¯¹æ°æ®åºä¸æ°æ®çæ¹åæ¯æä¹ çï¼å³ä½¿æ°æ®åºåçæ éä¹ä¸åºè¯¥å¯¹å ¶æä»»ä½å½±åã
è¿éè¦é¢å¤è¡¥å ä¸ç¹ï¼åªæä¿è¯äºäºå¡çæä¹ æ§ãååæ§ãé离æ§ä¹åï¼ä¸è´æ§æè½å¾å°ä¿éãä¹å°±æ¯è¯´ AãIãD æ¯ææ®µï¼C æ¯ç®çï¼ æ³å¿ 大家ä¹åæä¸æ ·ï¼è¢« ACID è¿ä¸ªæ¦å¿µè¢«è¯¯å¯¼äºå¾ä¹ ! æä¹æ¯çå¨å¿æèå¸çå ¬å¼è¯¾ãå¨å¿æçè½¯ä»¶æ¶æè¯¾ãopen in new windowæææ¸ æ¥çï¼å¤ç好书ï¼ï¼ï¼ï¼ã
å¦å¤ï¼DDIA ä¹å°±æ¯ ãDesigning Data-Intensive Applicationï¼æ°æ®å¯éååºç¨ç³»ç»è®¾è®¡ï¼ãopen in new window çä½è å¨ä»çè¿æ¬ä¹¦ä¸å¦æ¯è¯´ï¼
Atomicity, isolation, and durability are properties of the database, whereas consisâ tency (in the ACID sense) is a property of the application. The application may rely on the databaseâs atomicity and isolation properties in order to achieve consistency, but itâs not up to the database alone.
ç¿»è¯è¿æ¥çæææ¯ï¼ååæ§ï¼é离æ§åæä¹ æ§æ¯æ°æ®åºç屿§ï¼èä¸è´æ§ï¼å¨ ACID æä¹ä¸ï¼æ¯åºç¨ç¨åºç屿§ãåºç¨å¯è½ä¾èµæ°æ®åºçååæ§åéç¦»å±æ§æ¥å®ç°ä¸è´æ§ï¼ä½è¿å¹¶ä¸ä» åå³äºæ°æ®åºãå æ¤ï¼åæ¯ C ä¸å±äº ACID ã
ãDesigning Data-Intensive Applicationï¼æ°æ®å¯éååºç¨ç³»ç»è®¾è®¡ï¼ãè¿æ¬ä¹¦å¼ºæ¨ä¸æ³¢ï¼å¼å¾è¯»å¾å¤éï¼è±ç£ææ¥è¿ 90% ç人çäºè¿æ¬ä¹¦ä¹åç»äºäºæå¥½è¯ãå¦å¤ï¼ä¸æç¿»è¯çæ¬å·²ç»å¨ Github 弿ºï¼å°åï¼https://github.com/Vonng/ddiaopen in new window ã
9. å¹¶åäºå¡å¸¦æ¥äºåªäºé®é¢?
å¨å ¸åçåºç¨ç¨åºä¸ï¼å¤ä¸ªäºå¡å¹¶åè¿è¡ï¼ç»å¸¸ä¼æä½ç¸åçæ°æ®æ¥å®æåèªçä»»å¡ï¼å¤ä¸ªç¨æ·å¯¹å䏿°æ®è¿è¡æä½ï¼ãå¹¶åè½ç¶æ¯å¿ é¡»çï¼ä½å¯è½ä¼å¯¼è´ä»¥ä¸çé®é¢ã
è读ï¼Dirty readï¼
ä¸ä¸ªäºå¡è¯»åæ°æ®å¹¶ä¸å¯¹æ°æ®è¿è¡äºä¿®æ¹ï¼è¿ä¸ªä¿®æ¹å¯¹å ¶ä»äºå¡æ¥è¯´æ¯å¯è§çï¼å³ä½¿å½åäºå¡æ²¡ææäº¤ãè¿æ¶å¦å¤ä¸ä¸ªäºå¡è¯»åäºè¿ä¸ªè¿æªæäº¤çæ°æ®ï¼ä½ç¬¬ä¸ä¸ªäºå¡çªç¶åæ»ï¼å¯¼è´æ°æ®å¹¶æ²¡æè¢«æäº¤å°æ°æ®åºï¼é£ç¬¬äºä¸ªäºå¡è¯»åå°çå°±æ¯èæ°æ®ï¼è¿ä¹å°±æ¯è读çç±æ¥ã
ä¾å¦ï¼äºå¡ 1 读åæè¡¨ä¸çæ°æ® A=20ï¼äºå¡ 1 ä¿®æ¹ A=A-1ï¼äºå¡ 2 读åå° A = 19,äºå¡ 1 忻坼è´å¯¹ A çä¿®æ¹å¹¶ä¸ºæäº¤å°æ°æ®åºï¼ A çå¼è¿æ¯ 20ã
丢失修æ¹ï¼Lost to modifyï¼
å¨ä¸ä¸ªäºå¡è¯»åä¸ä¸ªæ°æ®æ¶ï¼å¦å¤ä¸ä¸ªäºå¡ä¹è®¿é®äºè¯¥æ°æ®ï¼é£ä¹å¨ç¬¬ä¸ä¸ªäºå¡ä¸ä¿®æ¹äºè¿ä¸ªæ°æ®åï¼ç¬¬äºä¸ªäºå¡ä¹ä¿®æ¹äºè¿ä¸ªæ°æ®ãè¿æ ·ç¬¬ä¸ä¸ªäºå¡å çä¿®æ¹ç»æå°±è¢«ä¸¢å¤±ï¼å æ¤ç§°ä¸ºä¸¢å¤±ä¿®æ¹ã
ä¾å¦ï¼äºå¡ 1 读åæè¡¨ä¸çæ°æ® A=20ï¼äºå¡ 2 ä¹è¯»å A=20ï¼äºå¡ 1 å ä¿®æ¹ A=A-1ï¼äºå¡ 2 忥ä¹ä¿®æ¹ A=A-1ï¼æç»ç»æ A=19ï¼äºå¡ 1 çä¿®æ¹è¢«ä¸¢å¤±ã
ä¸å¯éå¤è¯»ï¼Unrepeatable readï¼
æå¨ä¸ä¸ªäºå¡å 夿¬¡è¯»å䏿°æ®ãå¨è¿ä¸ªäºå¡è¿æ²¡æç»ææ¶ï¼å¦ä¸ä¸ªäºå¡ä¹è®¿é®è¯¥æ°æ®ãé£ä¹ï¼å¨ç¬¬ä¸ä¸ªäºå¡ä¸çä¸¤æ¬¡è¯»æ°æ®ä¹é´ï¼ç±äºç¬¬äºä¸ªäºå¡çä¿®æ¹å¯¼è´ç¬¬ä¸ä¸ªäºå¡ä¸¤æ¬¡è¯»åçæ°æ®å¯è½ä¸å¤ªä¸æ ·ãè¿å°±åçäºå¨ä¸ä¸ªäºå¡å 两次读å°çæ°æ®æ¯ä¸ä¸æ ·çæ åµï¼å æ¤ç§°ä¸ºä¸å¯éå¤è¯»ã
ä¾å¦ï¼äºå¡ 1 读åæè¡¨ä¸çæ°æ® A=20ï¼äºå¡ 2 ä¹è¯»å A=20ï¼äºå¡ 1 ä¿®æ¹ A=A-1ï¼äºå¡ 2 忬¡è¯»å A =19ï¼æ¤æ¶è¯»åçç»æåç¬¬ä¸æ¬¡è¯»åçç»æä¸åã
幻读ï¼Phantom readï¼
幻读ä¸ä¸å¯éå¤è¯»ç±»ä¼¼ãå®åçå¨ä¸ä¸ªäºå¡è¯»åäºå è¡æ°æ®ï¼æ¥çå¦ä¸ä¸ªå¹¶åäºå¡æå ¥äºä¸äºæ°æ®æ¶ãå¨éåçæ¥è¯¢ä¸ï¼ç¬¬ä¸ä¸ªäºå¡å°±ä¼åç°å¤äºä¸äºåæ¬ä¸åå¨çè®°å½ï¼å°±å¥½ååçäºå¹»è§ä¸æ ·ï¼æä»¥ç§°ä¸ºå¹»è¯»ã
ä¾å¦ï¼äºå¡ 2 读åæä¸ªèå´çæ°æ®ï¼äºå¡ 1 å¨è¿ä¸ªèå´æå ¥äºæ°çæ°æ®ï¼äºå¡ 2 忬¡è¯»åè¿ä¸ªèå´çæ°æ®åç°ç¸æ¯äºç¬¬ä¸æ¬¡è¯»åçç»æå¤äºæ°çæ°æ®ã
ä¸å¯éå¤è¯»å幻读æä»ä¹åºå«ï¼
- ä¸å¯éå¤è¯»çéç¹æ¯å å®¹ä¿®æ¹æè è®°å½åå°æ¯å¦å¤æ¬¡è¯»å䏿¡è®°å½åç°å ¶ä¸æäºè®°å½çå¼è¢«ä¿®æ¹ï¼
- 幻读çéç¹å¨äºè®°å½æ°å¢æ¯å¦å¤æ¬¡æ§è¡å䏿¡æ¥è¯¢è¯å¥ï¼DQLï¼æ¶ï¼åç°æ¥å°çè®°å½å¢å äºã
å¹»è¯»å ¶å®å¯ä»¥ç使¯ä¸å¯éå¤è¯»çä¸ç§ç¹æ®æ åµï¼åç¬æåºå幻读çåå ä¸»è¦æ¯è§£å³å¹»è¯»åä¸å¯éå¤è¯»çæ¹æ¡ä¸ä¸æ ·ã
举个ä¾åï¼æ§è¡ delete å update æä½çæ¶åï¼å¯ä»¥ç´æ¥å¯¹è®°å½å éï¼ä¿è¯äºå¡å®å ¨ãèæ§è¡ insert æä½çæ¶åï¼ç±äºè®°å½éï¼Record Lockï¼åªè½éä½å·²ç»åå¨çè®°å½ï¼ä¸ºäºé¿å æå ¥æ°è®°å½ï¼éè¦ä¾èµé´ééï¼Gap Lockï¼ãä¹å°±æ¯è¯´æ§è¡ insert æä½çæ¶åéè¦ä¾èµ Next-Key Lockï¼Record Lock+Gap Lockï¼ è¿è¡å 鿥ä¿è¯ä¸åºç°å¹»è¯»ã
10. å¹¶åäºå¡çæ§å¶æ¹å¼æåªäºï¼
MySQL ä¸å¹¶åäºå¡çæ§å¶æ¹å¼æ é就两ç§ï¼é å MVCCãéå¯ä»¥ç使¯æ²è§æ§å¶ç模å¼ï¼å¤çæ¬å¹¶åæ§å¶ï¼MVCCï¼Multiversion concurrency controlï¼å¯ä»¥ç使¯ä¹è§æ§å¶ç模å¼ã
é æ§å¶æ¹å¼ä¸ä¼éè¿éæ¥æ¾ç¤ºæ§å¶å ±äº«èµæºè䏿¯éè¿è°åº¦ææ®µï¼MySQL ä¸ä¸»è¦æ¯éè¿ è¯»åé æ¥å®ç°å¹¶åæ§å¶ã
- å ±äº«éï¼S éï¼ ï¼å称读éï¼äºå¡å¨è¯»åè®°å½çæ¶åè·åå ±äº«éï¼å 许å¤ä¸ªäºå¡åæ¶è·åï¼éå ¼å®¹ï¼ã
- æä»éï¼X éï¼ ï¼åç§°åé/ç¬å éï¼äºå¡å¨ä¿®æ¹è®°å½çæ¶åè·åæä»éï¼ä¸å 许å¤ä¸ªäºå¡åæ¶è·åã妿ä¸ä¸ªè®°å½å·²ç»è¢«å äºæä»éï¼é£å ¶ä»äºå¡ä¸è½åå¯¹è¿æ¡äºå¡å ä»»ä½ç±»åçéï¼éä¸å ¼å®¹ï¼ã
读åéå¯ä»¥åå°è¯»è¯»å¹¶è¡ï¼ä½æ¯æ æ³åå°å读ãååå¹¶è¡ãå¦å¤ï¼æ ¹æ®æ ¹æ®éç²åº¦çä¸åï¼å被å为 表级é(table-level locking) å è¡çº§é(row-level locking) ãInnoDB ä¸å æ¯æè¡¨çº§éï¼è¿æ¯æè¡çº§éï¼é»è®¤ä¸ºè¡çº§éãè¡çº§éçç²åº¦æ´å°ï¼ä» 对ç¸å ³çè®°å½ä¸éå³å¯ï¼å¯¹ä¸è¡æè å¤è¡è®°å½å éï¼ï¼æä»¥å¯¹äºå¹¶ååå ¥æä½æ¥è¯´ï¼ InnoDB çæ§è½æ´é«ãä¸è®ºæ¯è¡¨çº§éè¿æ¯è¡çº§éï¼é½åå¨å ±äº«éï¼Share Lockï¼S éï¼åæä»éï¼Exclusive Lockï¼X éï¼è¿ä¸¤ç±»ã
MVCC æ¯å¤çæ¬å¹¶åæ§å¶æ¹æ³ï¼å³å¯¹ä¸ä»½æ°æ®ä¼åå¨å¤ä¸ªçæ¬ï¼éè¿äºå¡çå¯è§æ§æ¥ä¿è¯äºå¡è½çå°èªå·±åºè¯¥çå°ççæ¬ãé叏伿ä¸ä¸ªå ¨å±ççæ¬åé 卿¥ä¸ºæ¯ä¸è¡æ°æ®è®¾ç½®çæ¬å·ï¼çæ¬å·æ¯å¯ä¸çã
MVCC å¨ MySQL ä¸å®ç°æä¾èµçææ®µä¸»è¦æ¯: éèåæ®µãread viewãundo logã
- undo log : undo log ç¨äºè®°å½æè¡æ°æ®çå¤ä¸ªçæ¬çæ°æ®ã
- read view å éèåæ®µ : ç¨æ¥å¤æå½åçæ¬æ°æ®çå¯è§æ§ã
11. SQL æ åå®ä¹äºåªäºäºå¡é离级å«?
SQL æ åå®ä¹äºå个é离级å«ï¼
- READ-UNCOMMITTED(è¯»åæªæäº¤) ï¼ æä½çé离级å«ï¼å 许读åå°æªæäº¤çæ°æ®åæ´ï¼å¯è½ä¼å¯¼è´è读ã幻读æä¸å¯éå¤è¯»ã
- READ-COMMITTED(读åå·²æäº¤) ï¼ å 许读åå¹¶åäºå¡å·²ç»æäº¤çæ°æ®ï¼å¯ä»¥é»æ¢è读ï¼ä½æ¯å¹»è¯»æä¸å¯éå¤è¯»ä»æå¯è½åçã
- REPEATABLE-READ(å¯éå¤è¯») ï¼ å¯¹åä¸å段ç夿¬¡è¯»åç»æé½æ¯ä¸è´çï¼é¤éæ°æ®æ¯è¢«æ¬èº«äºå¡èªå·±æä¿®æ¹ï¼å¯ä»¥é»æ¢è读åä¸å¯éå¤è¯»ï¼ä½å¹»è¯»ä»æå¯è½åçã
- SERIALIZABLE(å¯ä¸²è¡å) ï¼ æé«çé离级å«ï¼å®å ¨æä» ACID çé离级å«ãææçäºå¡ä¾æ¬¡é个æ§è¡ï¼è¿æ ·äºå¡ä¹é´å°±å®å ¨ä¸å¯è½äº§çå¹²æ°ï¼ä¹å°±æ¯è¯´ï¼è¯¥çº§å«å¯ä»¥é²æ¢è读ãä¸å¯éå¤è¯»ä»¥å幻读ã
éç¦»çº§å« | è读 | ä¸å¯éå¤è¯» | 幻读 |
READ-UNCOMMITTED | â | â | â |
READ-COMMITTED | Ã | â | â |
REPEATABLE-READ | Ã | Ã | â |
SERIALIZABLE | Ã | Ã | Ã |
12. MySQL çéç¦»çº§å«æ¯åºäºéå®ç°çåï¼
MySQL çé离级å«åºäºéå MVCC æºå¶å ±åå®ç°çã
SERIALIZABLE éç¦»çº§å«æ¯éè¿éæ¥å®ç°çï¼READ-COMMITTED å REPEATABLE-READ éç¦»çº§å«æ¯åºäº MVCC å®ç°çãä¸è¿ï¼ SERIALIZABLE ä¹å¤çå ¶ä»é离级å«å¯è½ä¹éè¦ç¨å°éæºå¶ï¼å°±æ¯å¦ REPEATABLE-READ å¨å½å读æ åµä¸éè¦ä½¿ç¨å é读æ¥ä¿è¯ä¸ä¼åºç°å¹»è¯»ã
13. MySQL çé»è®¤éç¦»çº§å«æ¯ä»ä¹?
MySQL InnoDB åå¨å¼æçé»è®¤æ¯æçéç¦»çº§å«æ¯ REPEATABLE-READï¼å¯é读ï¼ãæä»¬å¯ä»¥éè¿SELECT @@tx_isolation;å½ä»¤æ¥æ¥çï¼MySQL 8.0 该å½ä»¤æ¹ä¸ºSELECT @@transaction_isolation;
mysql> SELECT @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
MySQL é
鿝ä¸ç§å¸¸è§çå¹¶åäºå¡çæ§å¶æ¹å¼ã
14. 表级éåè¡çº§éäºè§£åï¼æä»ä¹åºå«ï¼
MyISAM ä» ä» æ¯æè¡¨çº§é(table-level locking)ï¼ä¸éå°±éæ´å¼ è¡¨ï¼è¿å¨å¹¶ååçæ åµä¸æ§é常差ãInnoDB ä¸å æ¯æè¡¨çº§é(table-level locking)ï¼è¿æ¯æè¡çº§é(row-level locking)ï¼é»è®¤ä¸ºè¡çº§éã
è¡çº§éçç²åº¦æ´å°ï¼ä» 对ç¸å ³çè®°å½ä¸éå³å¯ï¼å¯¹ä¸è¡æè å¤è¡è®°å½å éï¼ï¼æä»¥å¯¹äºå¹¶ååå ¥æä½æ¥è¯´ï¼ InnoDB çæ§è½æ´é«ã
表级éåè¡çº§éå¯¹æ¯ ï¼
- 表级éï¼ MySQL ä¸éå®ç²åº¦æå¤§çä¸ç§éï¼å ¨å±éé¤å¤ï¼ï¼æ¯é对éç´¢å¼å段å çéï¼å¯¹å½åæä½çæ´å¼ 表å éï¼å®ç°ç®åï¼èµæºæ¶è乿¯è¾å°ï¼å éå¿«ï¼ä¸ä¼åºç°æ»éãä¸è¿ï¼è§¦åéå²çªçæ¦çæé«ï¼é«å¹¶å䏿çæä½ã表级éååå¨å¼ææ å ³ï¼MyISAM å InnoDB 弿齿¯æè¡¨çº§éã
- è¡çº§éï¼ MySQL ä¸éå®ç²åº¦æå°çä¸ç§éï¼æ¯ é对索å¼å段å çé ï¼åªé对å½åæä½çè¡è®°å½è¿è¡å éã è¡çº§éè½å¤§å¤§åå°æ°æ®åºæä½çå²çªãå ¶å éç²åº¦æå°ï¼å¹¶å度é«ï¼ä½å éçå¼é乿大ï¼å éæ ¢ï¼ä¼åºç°æ»éãè¡çº§éååå¨å¼ææå ³ï¼æ¯å¨åå¨å¼æå±é¢å®ç°çã
è¡çº§éçä½¿ç¨æä»ä¹æ³¨æäºé¡¹ï¼
InnoDB çè¡éæ¯é对索å¼å段å çéï¼è¡¨çº§éæ¯é对éç´¢å¼å段å çéã彿们æ§è¡ UPDATEãDELETE è¯å¥æ¶ï¼å¦æ WHEREæ¡ä»¶ä¸å段没æå½ä¸å¯ä¸ç´¢å¼æè ç´¢å¼å¤±æçè¯ï¼å°±ä¼å¯¼è´æ«æå ¨è¡¨å¯¹è¡¨ä¸çææè¡è®°å½è¿è¡å éãè¿ä¸ªå¨æä»¬æ¥å¸¸å·¥ä½å¼åä¸ç»å¸¸ä¼éå°ï¼ä¸å®è¦å¤å¤æ³¨æï¼ï¼ï¼
ä¸è¿ï¼å¾å¤æ¶åå³ä½¿ç¨äºç´¢å¼ä¹æå¯è½ä¼èµ°å ¨è¡¨æ«æï¼è¿æ¯å 为 MySQL ä¼åå¨çåå ã
15. InnoDB æåªå ç±»è¡éï¼
InnoDB è¡éæ¯éè¿å¯¹ç´¢å¼æ°æ®é¡µä¸çè®°å½å éå®ç°çï¼MySQL InnoDB æ¯æä¸ç§è¡é宿¹å¼ï¼
- è®°å½éï¼Record Lockï¼ ï¼ä¹è¢«ç§°ä¸ºè®°å½éï¼å±äºå个è¡è®°å½ä¸çéã
- é´ééï¼Gap Lockï¼ ï¼éå®ä¸ä¸ªèå´ï¼ä¸å æ¬è®°å½æ¬èº«ã
- 临é®éï¼Next-Key Lockï¼ ï¼Record Lock+Gap Lockï¼éå®ä¸ä¸ªèå´ï¼å å«è®°å½æ¬èº«ï¼ä¸»è¦ç®çæ¯ä¸ºäºè§£å³å¹»è¯»é®é¢ï¼MySQL äºå¡é¨åæå°è¿ï¼ãè®°å½éåªè½éä½å·²ç»åå¨çè®°å½ï¼ä¸ºäºé¿å æå ¥æ°è®°å½ï¼éè¦ä¾èµé´ééã
å¨ InnoDB é»è®¤çéç¦»çº§å« REPEATABLE-READ ä¸ï¼è¡éé»è®¤ä½¿ç¨çæ¯ Next-Key Lockã使¯ï¼å¦ææä½çç´¢å¼æ¯å¯ä¸ç´¢å¼æä¸»é®ï¼InnoDB ä¼å¯¹ Next-Key Lock è¿è¡ä¼åï¼å°å ¶é级为 Record Lockï¼å³ä» éä½ç´¢å¼æ¬èº«ï¼è䏿¯èå´ã
ä¸äºå¤§åé¢è¯ä¸å¯è½ä¼é®å° Next-Key Lock çå éèå´ï¼è¿éæ¨èä¸ç¯æç« ï¼MySQL next-key lock å éèå´æ¯ä»ä¹ï¼ - ç¨åºåå°èª - 2021open in new window ã
16. å ±äº«éåæä»éå¢ï¼
ä¸è®ºæ¯è¡¨çº§éè¿æ¯è¡çº§éï¼é½åå¨å ±äº«éï¼Share Lockï¼S éï¼åæä»éï¼Exclusive Lockï¼X éï¼è¿ä¸¤ç±»ï¼
- å ±äº«éï¼S éï¼ ï¼å称读éï¼äºå¡å¨è¯»åè®°å½çæ¶åè·åå ±äº«éï¼å 许å¤ä¸ªäºå¡åæ¶è·åï¼éå ¼å®¹ï¼ã
- æä»éï¼X éï¼ ï¼åç§°åé/ç¬å éï¼äºå¡å¨ä¿®æ¹è®°å½çæ¶åè·åæä»éï¼ä¸å 许å¤ä¸ªäºå¡åæ¶è·åã妿ä¸ä¸ªè®°å½å·²ç»è¢«å äºæä»éï¼é£å ¶ä»äºå¡ä¸è½åå¯¹è¿æ¡äºå¡å ä»»ä½ç±»åçéï¼éä¸å ¼å®¹ï¼ã
æä»éä¸ä»»ä½çéé½ä¸å ¼å®¹ï¼å ±äº«éä» åå ±äº«éå ¼å®¹ã
S é | X é | |
S é | ä¸å²çª | å²çª |
X é | å²çª | å²çª |
ç±äº MVCC çåå¨ï¼å¯¹äºä¸è¬ç SELECT è¯å¥ï¼InnoDB ä¸ä¼å ä»»ä½éãä¸è¿ï¼ ä½ å¯ä»¥éè¿ä»¥ä¸è¯å¥æ¾å¼å å ±äº«éææä»éã
# å
±äº«é
SELECT ... LOCK IN SHARE MODE;
# æä»é
SELECT ... FOR UPDATE;
17. æåéæä»ä¹ä½ç¨ï¼
妿éè¦ç¨å°è¡¨éçè¯ï¼å¦ä½å¤æè¡¨ä¸çè®°å½æ²¡æè¡éå¢ï¼ä¸è¡ä¸è¡éåè¯å®æ¯ä¸è¡ï¼æ§è½å¤ªå·®ãæä»¬éè¦ç¨å°ä¸ä¸ªå«åæåéçä¸ä¸æ¥å¿«é夿æ¯å¦å¯ä»¥å¯¹æä¸ªè¡¨ä½¿ç¨è¡¨éã
æåéæ¯è¡¨çº§éï¼å ±æä¸¤ç§ï¼
- æåå ±äº«éï¼Intention Shared Lockï¼IS éï¼ï¼äºå¡ææå对表ä¸çæäºè®°å½å å ±äº«éï¼S éï¼ï¼å å ±äº«éåå¿ é¡»å åå¾è¯¥è¡¨ç IS éã
- æåæä»éï¼Intention Exclusive Lockï¼IX éï¼ï¼äºå¡ææå对表ä¸çæäºè®°å½å æä»éï¼X éï¼ï¼å æä»éä¹åå¿ é¡»å åå¾è¯¥è¡¨ç IX éã
æåéæ¯ææ°æ®å¼æèªå·±ç»´æ¤çï¼ç¨æ·æ æ³æå¨æä½æåéï¼å¨ä¸ºæ°æ®è¡å å ±äº«/æä»éä¹åï¼InooDB ä¼å è·åè¯¥æ°æ®è¡æå¨å¨æ°æ®è¡¨çå¯¹åºæåéã
æåéä¹é´æ¯äºç¸å ¼å®¹çã
IS é | IX é | |
IS é | å ¼å®¹ | å ¼å®¹ |
IX é | å ¼å®¹ | å ¼å®¹ |
æåéåå ±äº«éåæå®éäºæ¥ï¼è¿éæçæ¯è¡¨çº§å«çå ±äº«éåæä»éï¼æåéä¸ä¼ä¸è¡çº§çå ±äº«éåæä»éäºæ¥ï¼ã
IS é | IX é | |
S é | å ¼å®¹ | äºæ¥ |
X é | äºæ¥ | äºæ¥ |
ãMySQL ææ¯å å¹ InnoDB åå¨å¼æãè¿æ¬ä¹¦å¯¹åºçæè¿°åºè¯¥æ¯ç¬è¯¯äºã
18. å½å读åå¿«ç §è¯»æä»ä¹åºå«ï¼
å¿«ç §è¯»ï¼ä¸è´æ§ééå®è¯»ï¼å°±æ¯å纯ç SELECT è¯å¥ï¼ä½ä¸å æ¬ä¸é¢è¿ä¸¤ç±» SELECT è¯å¥ï¼
SELECT ... FOR UPDATE
SELECT ... LOCK IN SHARE MODE
å¿«ç §å³è®°å½çåå²çæ¬ï¼æ¯è¡è®°å½å¯è½åå¨å¤ä¸ªåå²çæ¬ï¼å¤çæ¬ææ¯ï¼ã
å¿«ç §è¯»çæ åµä¸ï¼å¦æè¯»åçè®°å½æ£å¨æ§è¡ UPDATE/DELETE æä½ï¼è¯»åæä½ä¸ä¼å æ¤å»çå¾ è®°å½ä¸ X éçéæ¾ï¼èæ¯ä¼å»è¯»åè¡çä¸ä¸ªå¿«ç §ã
åªæå¨äºå¡éç¦»çº§å« RC(读åå·²æäº¤) å RRï¼å¯é读ï¼ä¸ï¼InnoDB æä¼ä½¿ç¨ä¸è´æ§ééå®è¯»ï¼
- å¨ RC 级å«ä¸ï¼å¯¹äºå¿«ç §æ°æ®ï¼ä¸è´æ§ééå®è¯»æ»æ¯è¯»å被éå®è¡çææ°ä¸ä»½å¿«ç §æ°æ®ã
- å¨ RR 级å«ä¸ï¼å¯¹äºå¿«ç §æ°æ®ï¼ä¸è´æ§ééå®è¯»æ»æ¯è¯»åæ¬äºå¡å¼å§æ¶çè¡æ°æ®çæ¬ã
å¿«ç §è¯»æ¯è¾éåå¯¹äºæ°æ®ä¸è´æ§è¦æ±ä¸æ¯ç¹å«é«ä¸è¿½æ±æè´æ§è½çä¸å¡åºæ¯ã
å½å读 ï¼ä¸è´æ§éå®è¯»ï¼å°±æ¯ç»è¡è®°å½å X éæ S éã
å½å读çä¸äºå¸¸è§ SQL è¯å¥ç±»åå¦ä¸ï¼
# 对读çè®°å½å ä¸ä¸ªXé
SELECT...FOR UPDATE
# 对读çè®°å½å ä¸ä¸ªSé
SELECT...LOCK IN SHARE MODE
# 对修æ¹çè®°å½å ä¸ä¸ªXé
INSERT...
UPDATE...
DELETE...
19. èªå¢éæäºè§£åï¼
ä¸å¤ªéè¦çä¸ä¸ªç¥è¯ç¹ï¼ç®åäºè§£å³å¯ã
å ³ç³»åæ°æ®åºè®¾è®¡è¡¨çæ¶åï¼é叏伿ä¸åä½ä¸ºèªå¢ä¸»é®ãInnoDB ä¸çèªå¢ä¸»é®ä¼æ¶åä¸ç§æ¯è¾ç¹æ®ç表级éâ èªå¢éï¼AUTO-INC Locksï¼ ã
CREATE TABLE `sequence_id` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`stub` char(10) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
UNIQUE KEY `stub` (`stub`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
æ´åç¡®ç¹æ¥è¯´ï¼ä¸ä» ä» æ¯èªå¢ä¸»é®ï¼AUTO_INCREMENTçåé½ä¼æ¶åå°èªå¢éï¼æ¯ç«é主é®ä¹å¯ä»¥è®¾ç½®èªå¢é¿ã
妿ä¸ä¸ªäºå¡æ£å¨æå ¥æ°æ®å°æèªå¢åç表æ¶ï¼ä¼å è·åèªå¢éï¼æ¿ä¸å°å°±å¯è½ä¼è¢«é»å¡ä½ãè¿éçé»å¡è¡ä¸ºåªæ¯èªå¢éè¡ä¸ºçå ¶ä¸ä¸ç§ï¼å¯ä»¥ç解为èªå¢éå°±æ¯ä¸ä¸ªæ¥å£ï¼å ¶å ·ä½çå®ç°æå¤ç§ãå ·ä½çé 置项为 innodb_autoinc_lock_mode ï¼MySQL 5.1.22 å¼å ¥ï¼ï¼å¯ä»¥éæ©çå¼å¦ä¸ï¼
innodb_autoinc_lock_mode | ä»ç» |
ä¼ ç»æ¨¡å¼ | |
1 | è¿ç»æ¨¡å¼ï¼MySQL 8.0 ä¹åé»è®¤ï¼ |
2 | äº¤éæ¨¡å¼(MySQL 8.0 ä¹åé»è®¤) |
äº¤éæ¨¡å¼ä¸ï¼ææçâINSERT-LIKEâè¯å¥ï¼ææçæå ¥è¯å¥ï¼å æ¬ï¼ INSERTãREPLACEãINSERTâ¦SELECTãREPLACEâ¦SELECTãLOAD DATAçï¼é½ä¸ä½¿ç¨è¡¨çº§éï¼ä½¿ç¨çæ¯è½»éçº§äºæ¥éå®ç°ï¼å¤æ¡æå ¥è¯å¥å¯ä»¥å¹¶åæ§è¡ï¼é度æ´å¿«ï¼æ©å±æ§ä¹æ´å¥½ã
ä¸è¿ï¼å¦æä½ ç MySQL æ°æ®åºæä¸»ä»åæ¥éæ±å¹¶ä¸ Binlog å卿 ¼å¼ä¸º Statement çè¯ï¼ä¸è¦å° InnoDB èªå¢é模å¼è®¾ç½®ä¸ºäº¤å模å¼ï¼ä¸ç¶ä¼ææ°æ®ä¸ä¸è´æ§é®é¢ãè¿æ¯å ä¸ºå¹¶åæ åµä¸æå ¥è¯å¥çæ§è¡é¡ºåºå°±æ æ³å¾å°ä¿éã
妿 MySQL éç¨çæ ¼å¼ä¸º Statement ï¼é£ä¹ MySQL ç主ä»åæ¥å®é ä¸åæ¥çå°±æ¯ä¸æ¡ä¸æ¡ç SQL è¯å¥ã
æåï¼åæ¨èä¸ç¯æç« ï¼ ä¸ºä»ä¹ MySQL çèªå¢ä¸»é®ä¸åè°ä¹ä¸è¿ç»open in new window ã
MySQL æ§è½ä¼å
å ³äº MySQL æ§è½ä¼åç建议æ»ç»ï¼è¯·çè¿ç¯æç« ï¼MySQL 髿§è½ä¼åè§è建议æ»ç» ã
20. è½ç¨ MySQL ç´æ¥åå¨æä»¶ï¼æ¯å¦å¾çï¼åï¼
å¯ä»¥æ¯å¯ä»¥ï¼ç´æ¥å卿件坹åºçäºè¿å¶æ°æ®å³å¯ãä¸è¿ï¼è¿æ¯å»ºè®®ä¸è¦å¨æ°æ®åºä¸å卿件ï¼ä¼ä¸¥é影忰æ®åºæ§è½ï¼æ¶èè¿å¤åå¨ç©ºé´ã
å¯ä»¥éæ©ä½¿ç¨äºæå¡ååæä¾çå¼ç®±å³ç¨çæä»¶å卿å¡ï¼æç稳å®ï¼ä»·æ ¼ä¹æ¯è¾ä½ã
ä¹å¯ä»¥éæ©èªå»ºæä»¶å卿å¡ï¼å®ç°èµ·æ¥ä¹ä¸é¾ï¼åºäº FastDFSãMinIOï¼æ¨èï¼ ç弿ºé¡¹ç®å°±å¯ä»¥å®ç°åå¸å¼æä»¶æå¡ã
æ°æ®åºåªå卿件å°åä¿¡æ¯ï¼æä»¶ç±æä»¶å卿å¡è´è´£åå¨ã
ç¸å ³é 读ï¼Spring Boot æ´å MinIO å®ç°åå¸å¼æä»¶æå¡open in new window ã
21. MySQL å¦ä½åå¨ IP å°åï¼
å¯ä»¥å° IP å°åè½¬æ¢ææ´å½¢æ°æ®åå¨ï¼æ§è½æ´å¥½ï¼å ç¨ç©ºé´ä¹æ´å°ã
MySQL æä¾äºä¸¤ä¸ªæ¹æ³æ¥å¤ç ip å°å
- INET_ATON() ï¼ æ ip 转为æ ç¬¦å·æ´å (4-8 ä½)
- INET_NTOA() :ææ´åç ip 转为å°å
æå ¥æ°æ®åï¼å ç¨ INET_ATON() æ ip å°å转为æ´åï¼æ¾ç¤ºæ°æ®æ¶ï¼ä½¿ç¨ INET_NTOA() ææ´åç ip å°å转为å°åæ¾ç¤ºå³å¯ã
22. å¦ä½åæ SQL çæ§è½ï¼
æä»¬å¯ä»¥ä½¿ç¨ EXPLAIN å½ä»¤æ¥åæ SQL ç æ§è¡è®¡å ãæ§è¡è®¡åæ¯æä¸æ¡ SQL è¯å¥å¨ç»è¿ MySQL æ¥è¯¢ä¼åå¨çä¼åä¼åï¼å ·ä½çæ§è¡æ¹å¼ã
EXPLAIN å¹¶ä¸ä¼çç廿§è¡ç¸å ³çè¯å¥ï¼èæ¯éè¿ æ¥è¯¢ä¼åå¨ å¯¹è¯å¥è¿è¡åæï¼æ¾åºæä¼çæ¥è¯¢æ¹æ¡ï¼å¹¶æ¾ç¤ºå¯¹åºçä¿¡æ¯ã
EXPLAIN éç¨äº SELECT, DELETE, INSERT, REPLACE, å UPDATEè¯å¥ï¼æä»¬ä¸è¬åæ SELECT æ¥è¯¢è¾å¤ã
æä»¬è¿éç®åæ¥æ¼ç¤ºä¸ä¸ EXPLAIN ç使ç¨ã
EXPLAIN çè¾åºæ ¼å¼å¦ä¸ï¼
mysql> EXPLAIN SELECT `score`,`name` FROM `cus_order` ORDER BY `score` DESC;
+----+-------------+-----------+------------+------+---------------+------+---------+------+--------+----------+----------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-----------+------------+------+---------------+------+---------+------+--------+----------+----------------+
| 1 | SIMPLE | cus_order | NULL | ALL | NULL | NULL | NULL | NULL | 997572 | 100.00 | Using filesort |
+----+-------------+-----------+------------+------+---------------+------+---------+------+--------+----------+----------------+
1 row in set, 1 warning (0.00 sec)
åä¸ªåæ®µçå«ä¹å¦ä¸ï¼
åå | å«ä¹ |
id | SELECT æ¥è¯¢çåºåæ è¯ç¬¦ |
select_type | SELECT å ³é®å对åºçæ¥è¯¢ç±»å |
table | ç¨å°ç表å |
partitions | å¹é çååºï¼å¯¹äºæªååºç表ï¼å¼ä¸º NULL |
type | 表çè®¿é®æ¹æ³ |
possible_keys | å¯è½ç¨å°çç´¢å¼ |
key | å®é ç¨å°çç´¢å¼ |
key_len | æéç´¢å¼çé¿åº¦ |
ref | å½ä½¿ç¨ç´¢å¼ç弿¥è¯¢æ¶ï¼ä¸ç´¢å¼ä½æ¯è¾çåæå¸¸é |
rows | é¢è®¡è¦è¯»åçè¡æ° |
filtered | æè¡¨æ¡ä»¶è¿æ»¤åï¼çåçè®°å½æ°çç¾åæ¯ |
Extra | éå ä¿¡æ¯ |
ç¯å¹ é®é¢ï¼æè¿éåªæ¯ç®åä»ç»äºä¸ä¸ MySQL æ§è¡è®¡åï¼è¯¦ç»ä»ç»è¯·çï¼SQL çæ§è¡è®¡åè¿ç¯æç« ã
ç§ä¿¡æï¼é¢è¯é¢ï¼è·åå ¶ä»é¢è¯é¢èµæ