ç¹å»å
³æ³¨[å
¬ä¼å·](#å
¬ä¼å·)åæ¶è·åç¬ä¸»ææ°æ´æ°æç« ï¼å¹¶å¯å
è´¹é¢åæ¬ææ¡£é
å¥çãJavaé¢è¯çªå»ã以åJavaå·¥ç¨å¸å¿
å¤å¦ä¹ èµæºã
- [ä¹¦ç±æ¨è](#ä¹¦ç±æ¨è)
- [æåæç¨æ¨è](#æåæç¨æ¨è)
- [è§é¢æç¨æ¨è](#è§é¢æç¨æ¨è)
- [常è§é®é¢æ»ç»](#常è§é®é¢æ»ç»)
- [ä»ä¹æ¯MySQL?](#ä»ä¹æ¯mysql)
- [åå¨å¼æ](#åå¨å¼æ)
- [ä¸äºå¸¸ç¨å½ä»¤](#ä¸äºå¸¸ç¨å½ä»¤)
- [MyISAMåInnoDBåºå«](#myisamåinnodbåºå«)
- [å符éåæ ¡å¯¹è§å](#å符éåæ ¡å¯¹è§å)
- [ç´¢å¼](#ç´¢å¼)
- [æ¥è¯¢ç¼åç使ç¨](#æ¥è¯¢ç¼åç使ç¨)
- [ä»ä¹æ¯äºå¡?](#ä»ä¹æ¯äºå¡)
- [äºç©çåå¤§ç¹æ§(ACID)](#äºç©çåå¤§ç¹æ§acid)
- [å¹¶åäºå¡å¸¦æ¥åªäºé®é¢?](#å¹¶åäºå¡å¸¦æ¥åªäºé®é¢)
- [äºå¡éç¦»çº§å«æåªäº?MySQLçé»è®¤éç¦»çº§å«æ¯?](#äºå¡éç¦»çº§å«æåªäºmysqlçé»è®¤éç¦»çº§å«æ¯)
- [éæºå¶ä¸InnoDBéç®æ³](#éæºå¶ä¸innodbéç®æ³)
- [大表ä¼å](#大表ä¼å)
- [1. é宿°æ®çèå´](#1-é宿°æ®çèå´)
- [2. 读/åå离](#2-读åå离)
- [3. åç´ååº](#3-åç´ååº)
- [4. æ°´å¹³ååº](#4-æ°´å¹³ååº)
- [䏿¡SQLè¯å¥å¨MySQLä¸å¦ä½æ§è¡ç](#䏿¡sqlè¯å¥å¨mysqlä¸å¦ä½æ§è¡ç)
- [MySQL髿§è½ä¼åè§è建议](#mysql髿§è½ä¼åè§è建议)
- [䏿¡SQLè¯å¥æ§è¡å¾å¾æ
¢çåå æåªäºï¼](#䏿¡sqlè¯å¥æ§è¡å¾å¾æ
¢çåå æåªäº)
## ä¹¦ç±æ¨è
- ãSQLåºç¡æç¨ï¼ç¬¬2çï¼ã ï¼å
¥é¨çº§ï¼
- ã髿§è½MySQL : 第3çã (è¿é¶)
## æåæç¨æ¨è
- [SQL Tutorial](https://www.w3schools.com/sql/default.asp) ï¼SQLè¯å¥å¦ä¹ ,è±æï¼ã[SQL Tutorial](https://www.w3school.com.cn/sql/index.asp)ï¼SQLè¯å¥å¦ä¹ ,䏿ï¼ã[SQLè¯å¥å¨çº¿ç»ä¹ ](https://www.w3schools.com/sql/exercise.asp) ï¼é常ä¸éï¼
- [Github-MySQLå
¥é¨æç¨ï¼MySQL tutorial bookï¼](https://github.com/jaywcjlove/mysql-tutorial) ï¼ä»é¶å¼å§å¦ä¹ MySQLï¼ä¸»è¦æ¯é¢åMySQLæ°æ®åºç®¡çç³»ç»åå¦è
ï¼
- [宿¹æç¨](https://dev.mysql.com/doc/refman/5.7/)
- [MySQL æç¨ï¼è鏿ç¨ï¼](http://www.runoob.com/MySQL/MySQL-tutorial.html)
## ç¸å
³èµæºæ¨è
- [ä¸å½5çº§è¡æ¿åºåmysqlåº](https://github.com/kakuilan/china_area_mysql)
## è§é¢æç¨æ¨è
**åºç¡å
¥é¨ï¼** [ä¸MySQLçé¶è·ç¦»æ¥è§¦-æ
课ç½](https://www.imooc.com/learn/122)
**MySQLå¼åæå·§ï¼** [MySQLå¼åæå·§ï¼ä¸ï¼](https://www.imooc.com/learn/398)ãã[MySQLå¼åæå·§ï¼äºï¼](https://www.imooc.com/learn/427)ãã[MySQLå¼åæå·§ï¼ä¸ï¼](https://www.imooc.com/learn/449)
**MySQL5.7æ°ç¹æ§åç¸å
³ä¼åæå·§ï¼** [MySQL5.7çæ¬æ°ç¹æ§](https://www.imooc.com/learn/533)ãã[æ§è½ä¼åä¹MySQLä¼å](https://www.imooc.com/learn/194)
[MySQLé群ï¼PXCï¼å
¥é¨](https://www.imooc.com/learn/993)ãã[MyCATå
¥é¨ååºç¨](https://www.imooc.com/learn/951)
## 常è§é®é¢æ»ç»
### ä»ä¹æ¯MySQL?
MySQL æ¯ä¸ç§å
³ç³»åæ°æ®åºï¼å¨Javaä¼ä¸çº§å¼åä¸é常常ç¨ï¼å 为 MySQL æ¯å¼æºå
è´¹çï¼å¹¶ä¸æ¹ä¾¿æ©å±ãé¿éå·´å·´æ°æ®åºç³»ç»ä¹å¤§éç¨å°äº MySQLï¼å æ¤å®çç¨³å®æ§æ¯æä¿éçãMySQLæ¯å¼æ¾æºä»£ç çï¼å æ¤ä»»ä½äººé½å¯ä»¥å¨ GPL(General Public License) ç许å¯ä¸ä¸è½½å¹¶æ ¹æ®ä¸ªæ§åçéè¦å¯¹å
¶è¿è¡ä¿®æ¹ãMySQLçé»è®¤ç«¯å£å·æ¯**3306**ã
### åå¨å¼æ
#### ä¸äºå¸¸ç¨å½ä»¤
**æ¥çMySQLæä¾çææåå¨å¼æ**
```sql
mysql> show engines;
```

ä»ä¸å¾æä»¬å¯ä»¥æ¥çåº MySQL å½åé»è®¤çåå¨å¼ææ¯InnoDB,å¹¶ä¸å¨5.7çæ¬ææçåå¨å¼æä¸åªæ InnoDB æ¯äºå¡æ§åå¨å¼æï¼ä¹å°±æ¯è¯´åªæ InnoDB æ¯æäºå¡ã
**æ¥çMySQLå½åé»è®¤çåå¨å¼æ**
æä»¬ä¹å¯ä»¥éè¿ä¸é¢çå½ä»¤æ¥çé»è®¤çåå¨å¼æã
```sql
mysql> show variables like '%storage_engine%';
```
**æ¥ç表çåå¨å¼æ**
```sql
show table status like "table_name" ;
```

#### MyISAMåInnoDBåºå«
MyISAMæ¯MySQLçé»è®¤æ°æ®åºå¼æï¼5.5çä¹åï¼ãè½ç¶æ§è½æä½³ï¼è䏿ä¾äºå¤§éçç¹æ§ï¼å
æ¬å
¨æç´¢å¼ãå缩ã空é´å½æ°çï¼ä½MyISAM䏿¯æäºå¡åè¡çº§éï¼è䏿大ç缺é·å°±æ¯å´©æºåæ æ³å®å
¨æ¢å¤ãä¸è¿ï¼5.5çæ¬ä¹åï¼MySQLå¼å
¥äºInnoDBï¼äºå¡æ§æ°æ®åºå¼æï¼ï¼MySQL 5.5çæ¬åé»è®¤çåå¨å¼æä¸ºInnoDBã
大夿°æ¶åæä»¬ä½¿ç¨ç齿¯ InnoDB åå¨å¼æï¼ä½æ¯å¨æäºæ
åµä¸ä½¿ç¨ MyISAM 乿¯åéçæ¯å¦è¯»å¯éçæ
åµä¸ãï¼å¦æä½ ä¸ä»æ MyISAM å´©æºæ¢å¤é®é¢çè¯ï¼ã
**两è
ç对æ¯ï¼**
1. **æ¯å¦æ¯æè¡çº§é** : MyISAM åªæè¡¨çº§é(table-level locking)ï¼èInnoDB æ¯æè¡çº§é(row-level locking)å表级é,é»è®¤ä¸ºè¡çº§éã
2. **æ¯å¦æ¯æäºå¡åå´©æºåçå®å
¨æ¢å¤ï¼ MyISAM** 强è°çæ¯æ§è½ï¼æ¯æ¬¡æ¥è¯¢å
·æååæ§,å
¶æ§è¡é度æ¯InnoDBç±»åæ´å¿«ï¼ä½æ¯ä¸æä¾äºå¡æ¯æã使¯**InnoDB** æä¾äºå¡æ¯æäºå¡ï¼å¤é¨é®çé«çº§æ°æ®åºåè½ã å
·æäºå¡(commit)ãåæ»(rollback)åå´©æºä¿®å¤è½å(crash recovery capabilities)çäºå¡å®å
¨(transaction-safe (ACID compliant))å表ã
3. **æ¯å¦æ¯æå¤é®ï¼** MyISAM䏿¯æï¼èInnoDBæ¯æã
4. **æ¯å¦æ¯æMVCC** ï¼ä»
InnoDB æ¯æãåºå¯¹é«å¹¶åäºå¡, MVCCæ¯å纯çå 鿴髿;MVCCåªå¨ `READ COMMITTED` å `REPEATABLE READ` 两个é离级å«ä¸å·¥ä½;MVCCå¯ä»¥ä½¿ç¨ ä¹è§(optimistic)é å æ²è§(pessimistic)鿥å®ç°;åæ°æ®åºä¸MVCCå®ç°å¹¶ä¸ç»ä¸ãæ¨èé
读ï¼[MySQL-InnoDB-MVCCå¤çæ¬å¹¶åæ§å¶](https://segmentfault.com/a/1190000012650596)
5. ......
ãMySQL髿§è½ãä¸é¢æä¸å¥è¯è¿æ ·åå°:
> ä¸è¦è½»æç¸ä¿¡âMyISAMæ¯InnoDBå¿«âä¹ç±»çç»éªä¹è°ï¼è¿ä¸ªç»è®ºå¾å¾ä¸æ¯ç»å¯¹çãå¨å¾å¤æä»¬å·²ç¥åºæ¯ä¸ï¼InnoDBçé度é½å¯ä»¥è®©MyISAMæå°è«åï¼å°¤å
¶æ¯ç¨å°äºèç°ç´¢å¼ï¼æè
éè¦è®¿é®çæ°æ®é½å¯ä»¥æ¾å
¥å
åçåºç¨ã
ä¸è¬æ
åµä¸æä»¬éæ© InnoDB 齿¯æ²¡æé®é¢çï¼ä½æ¯æäºæ
åµä¸ä½ å¹¶ä¸å¨ä¹å¯æ©å±è½ååå¹¶åè½åï¼ä¹ä¸éè¦äºå¡æ¯æï¼ä¹ä¸å¨ä¹å´©æºåçå®å
¨æ¢å¤é®é¢çè¯ï¼éæ©MyISAM乿¯ä¸ä¸ªä¸éçéæ©ã使¯ä¸è¬æ
åµä¸ï¼æä»¬é½æ¯éè¦èèå°è¿äºé®é¢çã
### å符éåæ ¡å¯¹è§å
å符éæçæ¯ä¸ç§ä»äºè¿å¶ç¼ç å°æç±»å符符å·çæ å°ãæ ¡å¯¹è§å忝ææç§å符éä¸çæåºè§åãMySQL䏿¯ä¸ç§å符éé½ä¼å¯¹åºä¸ç³»åçæ ¡å¯¹è§åã
MySQLéç¨çæ¯ç±»ä¼¼ç»§æ¿çæ¹å¼æå®å符éçé»è®¤å¼ï¼æ¯ä¸ªæ°æ®åºä»¥åæ¯å¼ æ°æ®è¡¨é½æèªå·±çé»è®¤å¼ï¼ä»ä»¬éå±ç»§æ¿ãæ¯å¦ï¼æä¸ªåºä¸ææè¡¨çé»è®¤å符éå°æ¯è¯¥æ°æ®åºææå®çå符éï¼è¿äºè¡¨å¨æ²¡ææå®å符éçæ
åµä¸ï¼æä¼éç¨é»è®¤å符éï¼ PSï¼æ´çèªãJavaå·¥ç¨å¸ä¿®ç¼ä¹éã
详ç»å
容å¯ä»¥åèï¼ [MySQLå符éåæ ¡å¯¹è§åççè§£](https://www.cnblogs.com/geaozhang/p/6724393.html#MySQLyuzifuji)
### ç´¢å¼
MySQLç´¢å¼ä½¿ç¨çæ°æ®ç»æä¸»è¦æ**BTreeç´¢å¼** å **åå¸ç´¢å¼** ã对äºåå¸ç´¢å¼æ¥è¯´ï¼åºå±çæ°æ®ç»æå°±æ¯åå¸è¡¨ï¼å æ¤å¨ç»å¤§å¤æ°éæ±ä¸ºåæ¡è®°å½æ¥è¯¢çæ¶åï¼å¯ä»¥éæ©åå¸ç´¢å¼ï¼æ¥è¯¢æ§è½æå¿«ï¼å
¶ä½å¤§é¨ååºæ¯ï¼å»ºè®®éæ©BTreeç´¢å¼ã
MySQLçBTreeç´¢å¼ä½¿ç¨çæ¯Bæ ä¸çB+Treeï¼ä½å¯¹äºä¸»è¦ç两ç§åå¨å¼æçå®ç°æ¹å¼æ¯ä¸åçã
- **MyISAM:** B+Treeå¶èç¹çdataååæ¾çæ¯æ°æ®è®°å½çå°åãå¨ç´¢å¼æ£ç´¢çæ¶åï¼é¦å
æç
§B+Treeæç´¢ç®æ³æç´¢ç´¢å¼ï¼å¦ææå®çKeyåå¨ï¼åååºå
¶ data åçå¼ï¼ç¶å以 data åçå¼ä¸ºå°å读åç¸åºçæ°æ®è®°å½ãè¿è¢«ç§°ä¸ºâéèç°ç´¢å¼âã
- **InnoDB:** å
¶æ°æ®æä»¶æ¬èº«å°±æ¯ç´¢å¼æä»¶ãç¸æ¯MyISAMï¼ç´¢å¼æä»¶åæ°æ®æä»¶æ¯å离çï¼å
¶è¡¨æ°æ®æä»¶æ¬èº«å°±æ¯æB+Treeç»ç»çä¸ä¸ªç´¢å¼ç»æï¼æ çå¶èç¹dataåä¿åäºå®æ´çæ°æ®è®°å½ãè¿ä¸ªç´¢å¼çkeyæ¯æ°æ®è¡¨ç主é®ï¼å æ¤InnoDBè¡¨æ°æ®æä»¶æ¬èº«å°±æ¯ä¸»ç´¢å¼ãè¿è¢«ç§°ä¸ºâèç°ç´¢å¼ï¼æèéç´¢å¼ï¼âãèå
¶ä½çç´¢å¼é½ä½ä¸ºè¾
å©ç´¢å¼ï¼è¾
å©ç´¢å¼çdataååå¨ç¸åºè®°å½ä¸»é®çå¼è䏿¯å°åï¼è¿ä¹æ¯åMyISAMä¸åçå°æ¹ã**卿 ¹æ®ä¸»ç´¢å¼æç´¢æ¶ï¼ç´æ¥æ¾å°keyæå¨çèç¹å³å¯ååºæ°æ®ï¼å¨æ ¹æ®è¾
å©ç´¢å¼æ¥æ¾æ¶ï¼åéè¦å
ååºä¸»é®çå¼ï¼åèµ°ä¸é主索å¼ã** **å æ¤ï¼å¨è®¾è®¡è¡¨çæ¶åï¼ä¸å»ºè®®ä½¿ç¨è¿é¿çåæ®µä½ä¸ºä¸»é®ï¼ä¹ä¸å»ºè®®ä½¿ç¨éåè°çåæ®µä½ä¸ºä¸»é®ï¼è¿æ ·ä¼é æä¸»ç´¢å¼é¢ç¹åè£ã** PSï¼æ´çèªãJavaå·¥ç¨å¸ä¿®ç¼ä¹éã
**æ´å¤å
³äºç´¢å¼çå
容å¯ä»¥æ¥çææ¡£é¦é¡µMySQLç®å½ä¸å
³äºç´¢å¼çè¯¦ç»æ»ç»ã**
### æ¥è¯¢ç¼åç使ç¨
> æ§è¡æ¥è¯¢è¯å¥çæ¶åï¼ä¼å
æ¥è¯¢ç¼åãä¸è¿ï¼MySQL 8.0 çæ¬åç§»é¤ï¼å 为è¿ä¸ªåè½ä¸å¤ªå®ç¨
my.cnfå å
¥ä»¥ä¸é
ç½®ï¼éå¯MySQLå¼å¯æ¥è¯¢ç¼å
```properties
query_cache_type=1
query_cache_size=600000
```
MySQLæ§è¡ä»¥ä¸å½ä»¤ä¹å¯ä»¥å¼å¯æ¥è¯¢ç¼å
```properties
set global query_cache_type=1;
set global query_cache_size=600000;
```
å¦ä¸ï¼**å¼å¯æ¥è¯¢ç¼ååå¨åæ ·çæ¥è¯¢æ¡ä»¶ä»¥åæ°æ®æ
åµä¸ï¼ä¼ç´æ¥å¨ç¼åä¸è¿åç»æ**ãè¿éçæ¥è¯¢æ¡ä»¶å
æ¬æ¥è¯¢æ¬èº«ãå½åè¦æ¥è¯¢çæ°æ®åºã客æ·ç«¯åè®®çæ¬å·çä¸äºå¯è½å½±åç»æçä¿¡æ¯ãå æ¤ä»»ä½ä¸¤ä¸ªæ¥è¯¢å¨ä»»ä½å符ä¸çä¸åé½ä¼å¯¼è´ç¼åä¸å½ä¸ãæ¤å¤ï¼å¦ææ¥è¯¢ä¸å
å«ä»»ä½ç¨æ·èªå®ä¹å½æ°ãåå¨å½æ°ãç¨æ·åéã临æ¶è¡¨ãMySQLåºä¸çç³»ç»è¡¨ï¼å
¶æ¥è¯¢ç»æä¹ä¸ä¼è¢«ç¼åã
ç¼å建ç«ä¹åï¼MySQLçæ¥è¯¢ç¼åç³»ç»ä¼è·è¸ªæ¥è¯¢ä¸æ¶åçæ¯å¼ è¡¨ï¼å¦æè¿äºè¡¨ï¼æ°æ®æç»æï¼åçååï¼é£ä¹åè¿å¼ 表ç¸å
³çææç¼åæ°æ®é½å°å¤±æã
**ç¼åè½ç¶è½å¤æåæ°æ®åºçæ¥è¯¢æ§è½ï¼ä½æ¯ç¼ååæ¶ä¹å¸¦æ¥äºé¢å¤çå¼éï¼æ¯æ¬¡æ¥è¯¢åé½è¦å䏿¬¡ç¼åæä½ï¼å¤±æåè¿è¦éæ¯ã** å æ¤ï¼å¼å¯ç¼åæ¥è¯¢è¦è°¨æ
ï¼å°¤å
¶å¯¹äºåå¯éçåºç¨æ¥è¯´æ´æ¯å¦æ¤ã妿å¼å¯ï¼è¦æ³¨æåçæ§å¶ç¼å空é´å¤§å°ï¼ä¸è¬æ¥è¯´å
¶å¤§å°è®¾ç½®ä¸ºå åMBæ¯è¾åéãæ¤å¤ï¼**è¿å¯ä»¥éè¿sql_cacheåsql_no_cacheæ¥æ§å¶æä¸ªæ¥è¯¢è¯å¥æ¯å¦éè¦ç¼åï¼**
```sql
select sql_no_cache count(*) from usr;
```
### ä»ä¹æ¯äºå¡?
**äºå¡æ¯é»è¾ä¸çä¸ç»æä½ï¼è¦ä¹é½æ§è¡ï¼è¦ä¹é½ä¸æ§è¡ã**
äºå¡æç»å
¸ä¹ç»å¸¸è¢«æ¿åºæ¥è¯´ä¾åå°±æ¯è½¬è´¦äºãåå¦å°æè¦ç»å°çº¢è½¬è´¦1000å
ï¼è¿ä¸ªè½¬è´¦ä¼æ¶åå°ä¸¤ä¸ªå
³é®æä½å°±æ¯ï¼å°å°æçä½é¢åå°1000å
ï¼å°å°çº¢çä½é¢å¢å 1000å
ãä¸ä¸å¨è¿ä¸¤ä¸ªæä½ä¹é´çªç¶åºç°é误æ¯å¦é¶è¡ç³»ç»å´©æºï¼å¯¼è´å°æä½é¢åå°èå°çº¢çä½é¢æ²¡æå¢å ï¼è¿æ ·å°±ä¸å¯¹äºãäºå¡å°±æ¯ä¿è¯è¿ä¸¤ä¸ªå
³é®æä½è¦ä¹é½æåï¼è¦ä¹é½è¦å¤±è´¥ã
### äºç©çåå¤§ç¹æ§(ACID)

1. **ååæ§ï¼Atomicityï¼ï¼** äºå¡æ¯æå°çæ§è¡åä½ï¼ä¸å
许åå²ãäºå¡çååæ§ç¡®ä¿å¨ä½è¦ä¹å
¨é¨å®æï¼è¦ä¹å®å
¨ä¸èµ·ä½ç¨ï¼
2. **ä¸è´æ§ï¼Consistencyï¼ï¼** æ§è¡äºå¡ååï¼æ°æ®ä¿æä¸è´ï¼å¤ä¸ªäºå¡å¯¹åä¸ä¸ªæ°æ®è¯»åçç»ææ¯ç¸åçï¼
3. **é离æ§ï¼Isolationï¼ï¼** å¹¶åè®¿é®æ°æ®åºæ¶ï¼ä¸ä¸ªç¨æ·çäºå¡ä¸è¢«å
¶ä»äºå¡æå¹²æ°ï¼åå¹¶åäºå¡ä¹é´æ°æ®åºæ¯ç¬ç«çï¼
4. **æä¹
æ§ï¼Durabilityï¼ï¼** ä¸ä¸ªäºå¡è¢«æäº¤ä¹åãå®å¯¹æ°æ®åºä¸æ°æ®çæ¹åæ¯æä¹
çï¼å³ä½¿æ°æ®åºåçæ
éä¹ä¸åºè¯¥å¯¹å
¶æä»»ä½å½±åã
### å¹¶åäºå¡å¸¦æ¥åªäºé®é¢?
å¨å
¸åçåºç¨ç¨åºä¸ï¼å¤ä¸ªäºå¡å¹¶åè¿è¡ï¼ç»å¸¸ä¼æä½ç¸åçæ°æ®æ¥å®æåèªçä»»å¡ï¼å¤ä¸ªç¨æ·å¯¹å䏿°æ®è¿è¡æä½ï¼ãå¹¶åè½ç¶æ¯å¿
é¡»çï¼ä½å¯è½ä¼å¯¼è´ä»¥ä¸çé®é¢ã
- **è读ï¼Dirty readï¼:** å½ä¸ä¸ªäºå¡æ£å¨è®¿é®æ°æ®å¹¶ä¸å¯¹æ°æ®è¿è¡äºä¿®æ¹ï¼èè¿ç§ä¿®æ¹è¿æ²¡ææäº¤å°æ°æ®åºä¸ï¼è¿æ¶å¦å¤ä¸ä¸ªäºå¡ä¹è®¿é®äºè¿ä¸ªæ°æ®ï¼ç¶å使ç¨äºè¿ä¸ªæ°æ®ãå 为è¿ä¸ªæ°æ®æ¯è¿æ²¡ææäº¤çæ°æ®ï¼é£ä¹å¦å¤ä¸ä¸ªäºå¡è¯»å°çè¿ä¸ªæ°æ®æ¯âèæ°æ®âï¼ä¾æ®âèæ°æ®âæåçæä½å¯è½æ¯ä¸æ£ç¡®çã
- **丢失修æ¹ï¼Lost to modifyï¼:** æå¨ä¸ä¸ªäºå¡è¯»åä¸ä¸ªæ°æ®æ¶ï¼å¦å¤ä¸ä¸ªäºå¡ä¹è®¿é®äºè¯¥æ°æ®ï¼é£ä¹å¨ç¬¬ä¸ä¸ªäºå¡ä¸ä¿®æ¹äºè¿ä¸ªæ°æ®åï¼ç¬¬äºä¸ªäºå¡ä¹ä¿®æ¹äºè¿ä¸ªæ°æ®ãè¿æ ·ç¬¬ä¸ä¸ªäºå¡å
çä¿®æ¹ç»æå°±è¢«ä¸¢å¤±ï¼å æ¤ç§°ä¸ºä¸¢å¤±ä¿®æ¹ã ä¾å¦ï¼äºå¡1读åæè¡¨ä¸çæ°æ®A=20ï¼äºå¡2ä¹è¯»åA=20ï¼äºå¡1ä¿®æ¹A=A-1ï¼äºå¡2ä¹ä¿®æ¹A=A-1ï¼æç»ç»æA=19ï¼äºå¡1çä¿®æ¹è¢«ä¸¢å¤±ã
- **ä¸å¯éå¤è¯»ï¼Unrepeatablereadï¼:** æå¨ä¸ä¸ªäºå¡å
夿¬¡è¯»å䏿°æ®ãå¨è¿ä¸ªäºå¡è¿æ²¡æç»ææ¶ï¼å¦ä¸ä¸ªäºå¡ä¹è®¿é®è¯¥æ°æ®ãé£ä¹ï¼å¨ç¬¬ä¸ä¸ªäºå¡ä¸çä¸¤æ¬¡è¯»æ°æ®ä¹é´ï¼ç±äºç¬¬äºä¸ªäºå¡çä¿®æ¹å¯¼è´ç¬¬ä¸ä¸ªäºå¡ä¸¤æ¬¡è¯»åçæ°æ®å¯è½ä¸å¤ªä¸æ ·ãè¿å°±åçäºå¨ä¸ä¸ªäºå¡å
两次读å°çæ°æ®æ¯ä¸ä¸æ ·çæ
åµï¼å æ¤ç§°ä¸ºä¸å¯éå¤è¯»ã
- **幻读ï¼Phantom readï¼:** 幻读ä¸ä¸å¯éå¤è¯»ç±»ä¼¼ãå®åçå¨ä¸ä¸ªäºå¡ï¼T1ï¼è¯»åäºå è¡æ°æ®ï¼æ¥çå¦ä¸ä¸ªå¹¶åäºå¡ï¼T2ï¼æå
¥äºä¸äºæ°æ®æ¶ãå¨éåçæ¥è¯¢ä¸ï¼ç¬¬ä¸ä¸ªäºå¡ï¼T1ï¼å°±ä¼åç°å¤äºä¸äºåæ¬ä¸åå¨çè®°å½ï¼å°±å¥½ååçäºå¹»è§ä¸æ ·ï¼æä»¥ç§°ä¸ºå¹»è¯»ã
**ä¸å¯éå¤è¯»å幻读åºå«ï¼**
ä¸å¯éå¤è¯»çéç¹æ¯ä¿®æ¹æ¯å¦å¤æ¬¡è¯»å䏿¡è®°å½åç°å
¶ä¸æäºåçå¼è¢«ä¿®æ¹ï¼å¹»è¯»çéç¹å¨äºæ°å¢æè
å 餿¯å¦å¤æ¬¡è¯»å䏿¡è®°å½åç°è®°å½å¢å¤æåå°äºã
### äºå¡éç¦»çº§å«æåªäº?MySQLçé»è®¤éç¦»çº§å«æ¯?
**SQL æ åå®ä¹äºå个é离级å«ï¼**
- **READ-UNCOMMITTED(è¯»åæªæäº¤)ï¼** æä½çé离级å«ï¼å
许读åå°æªæäº¤çæ°æ®åæ´ï¼**å¯è½ä¼å¯¼è´è读ã幻读æä¸å¯éå¤è¯»**ã
- **READ-COMMITTED(读åå·²æäº¤)ï¼** å
许读åå¹¶åäºå¡å·²ç»æäº¤çæ°æ®ï¼**å¯ä»¥é»æ¢è读ï¼ä½æ¯å¹»è¯»æä¸å¯éå¤è¯»ä»æå¯è½åç**ã
- **REPEATABLE-READ(å¯éå¤è¯»)ï¼** 对åä¸å段ç夿¬¡è¯»åç»æé½æ¯ä¸è´çï¼é¤éæ°æ®æ¯è¢«æ¬èº«äºå¡èªå·±æä¿®æ¹ï¼**å¯ä»¥é»æ¢è读åä¸å¯éå¤è¯»ï¼ä½å¹»è¯»ä»æå¯è½åç**ã
- **SERIALIZABLE(å¯ä¸²è¡å)ï¼** æé«çé离级å«ï¼å®å
¨æä»ACIDçé离级å«ãææçäºå¡ä¾æ¬¡é个æ§è¡ï¼è¿æ ·äºå¡ä¹é´å°±å®å
¨ä¸å¯è½äº§çå¹²æ°ï¼ä¹å°±æ¯è¯´ï¼**该级å«å¯ä»¥é²æ¢è读ãä¸å¯éå¤è¯»ä»¥å幻读**ã
------
| éç¦»çº§å« | è读 | ä¸å¯éå¤è¯» | 幻影读 |
| :--------------: | :--: | :--------: | :----: |
| READ-UNCOMMITTED | â | â | â |
| READ-COMMITTED | Ã | â | â |
| REPEATABLE-READ | Ã | Ã | â |
| SERIALIZABLE | Ã | Ã | Ã |
MySQL InnoDB åå¨å¼æçé»è®¤æ¯æçéç¦»çº§å«æ¯ **REPEATABLE-READï¼å¯é读ï¼**ãæä»¬å¯ä»¥éè¿`SELECT @@tx_isolation;`å½ä»¤æ¥æ¥ç
```sql
mysql> SELECT @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
```
è¿ééè¦æ³¨æçæ¯ï¼ä¸ SQL æ åä¸åçå°æ¹å¨äº InnoDB åå¨å¼æå¨ **REPEATABLE-READï¼å¯é读ï¼**
äºå¡é离级å«ä¸ä½¿ç¨çæ¯Next-Key Lock éç®æ³ï¼å æ¤å¯ä»¥é¿å
幻读ç产çï¼è¿ä¸å
¶ä»æ°æ®åºç³»ç»(å¦ SQL Server)
æ¯ä¸åçãæä»¥è¯´InnoDB åå¨å¼æçé»è®¤æ¯æçéç¦»çº§å«æ¯ **REPEATABLE-READï¼å¯é读ï¼** å·²ç»å¯ä»¥å®å
¨ä¿è¯äºå¡çé离æ§è¦æ±ï¼å³è¾¾å°äº
SQLæ åç **SERIALIZABLE(å¯ä¸²è¡å)** é离级å«ãå 为é离级å«è¶ä½ï¼äºå¡è¯·æ±çéè¶å°ï¼æä»¥å¤§é¨åæ°æ®åºç³»ç»çé离级å«é½æ¯ **READ-COMMITTED(读åæäº¤å
容)** ï¼ä½æ¯ä½ è¦ç¥éçæ¯InnoDB åå¨å¼æé»è®¤ä½¿ç¨ **REPEAaTABLE-READï¼å¯é读ï¼** å¹¶ä¸ä¼æä»»ä½æ§è½æå¤±ã
InnoDB åå¨å¼æå¨ **åå¸å¼äºå¡** çæ
åµä¸ä¸è¬ä¼ç¨å° **SERIALIZABLE(å¯ä¸²è¡å)** é离级å«ã
### éæºå¶ä¸InnoDBéç®æ³
**MyISAMåInnoDBåå¨å¼æä½¿ç¨çéï¼**
- MyISAMéç¨è¡¨çº§é(table-level locking)ã
- InnoDBæ¯æè¡çº§é(row-level locking)å表级é,é»è®¤ä¸ºè¡çº§é
**表级éåè¡çº§é对æ¯ï¼**
- **表级éï¼** MySQLä¸éå® **ç²åº¦æå¤§** çä¸ç§éï¼å¯¹å½åæä½çæ´å¼ 表å éï¼å®ç°ç®åï¼èµæºæ¶è乿¯è¾å°ï¼å éå¿«ï¼ä¸ä¼åºç°æ»éãå
¶éå®ç²åº¦æå¤§ï¼è§¦åéå²çªçæ¦çæé«ï¼å¹¶å度æä½ï¼MyISAMå InnoDB弿齿¯æè¡¨çº§éã
- **è¡çº§éï¼** MySQLä¸éå® **ç²åº¦æå°** çä¸ç§éï¼åªé对å½åæä½çè¡è¿è¡å éã è¡çº§éè½å¤§å¤§åå°æ°æ®åºæä½çå²çªãå
¶å éç²åº¦æå°ï¼å¹¶å度é«ï¼ä½å éçå¼é乿大ï¼å éæ
¢ï¼ä¼åºç°æ»éã
详ç»å
容å¯ä»¥åèï¼ MySQLéæºå¶ç®åäºè§£ä¸ä¸ï¼[https://blog.csdn.net/qq_34337272/article/details/80611486](https://blog.csdn.net/qq_34337272/article/details/80611486)
**InnoDBåå¨å¼æçéçç®æ³æä¸ç§ï¼**
- Record lockï¼å个è¡è®°å½ä¸çé
- Gap lockï¼é´ééï¼éå®ä¸ä¸ªèå´ï¼ä¸å
æ¬è®°å½æ¬èº«
- Next-key lockï¼record+gap éå®ä¸ä¸ªèå´ï¼å
å«è®°å½æ¬èº«
**ç¸å
³ç¥è¯ç¹ï¼**
1. innodb对äºè¡çæ¥è¯¢ä½¿ç¨next-key lock
2. Next-locking keying为äºè§£å³Phantom Problem幻读é®é¢
3. 彿¥è¯¢çç´¢å¼å«æå¯ä¸å±æ§æ¶ï¼å°next-key locké级为record key
4. Gapé设计çç®çæ¯ä¸ºäºé»æ¢å¤ä¸ªäºå¡å°è®°å½æå
¥å°åä¸èå´å
ï¼èè¿ä¼å¯¼è´å¹»è¯»é®é¢ç产ç
5. æä¸¤ç§æ¹å¼æ¾å¼å
³égapéï¼ï¼é¤äºå¤é®çº¦æåå¯ä¸æ§æ£æ¥å¤ï¼å
¶ä½æ
åµä»
使ç¨record lockï¼ A. å°äºå¡é离级å«è®¾ç½®ä¸ºRC B. å°åæ°innodb_locks_unsafe_for_binlog设置为1
### 大表ä¼å
å½MySQLåè¡¨è®°å½æ°è¿å¤§æ¶ï¼æ°æ®åºçCRUDæ§è½ä¼ææ¾ä¸éï¼ä¸äºå¸¸è§çä¼åæªæ½å¦ä¸ï¼
#### 1. é宿°æ®çèå´
å¡å¿
ç¦æ¢ä¸å¸¦ä»»ä½éå¶æ°æ®èå´æ¡ä»¶çæ¥è¯¢è¯å¥ãæ¯å¦ï¼æä»¬å½ç¨æ·å¨æ¥è¯¢è®¢ååå²çæ¶åï¼æä»¬å¯ä»¥æ§å¶å¨ä¸ä¸ªæçèå´å
ï¼
#### 2. 读/åå离
ç»å
¸çæ°æ®åºæåæ¹æ¡ï¼ä¸»åºè´è´£åï¼ä»åºè´è´£è¯»ï¼
#### 3. åç´ååº
**æ ¹æ®æ°æ®åºé颿°æ®è¡¨çç¸å
³æ§è¿è¡æåã** ä¾å¦ï¼ç¨æ·è¡¨ä¸æ¢æç¨æ·çç»å½ä¿¡æ¯åæç¨æ·çåºæ¬ä¿¡æ¯ï¼å¯ä»¥å°ç¨æ·è¡¨æåæä¸¤ä¸ªåç¬ç表ï¼çè³æ¾å°åç¬çåºåååºã
**ç®åæ¥è¯´åç´æåæ¯ææ°æ®è¡¨åçæåï¼æä¸å¼ 忝è¾å¤ç表æå为å¤å¼ 表ã** å¦ä¸å¾æç¤ºï¼è¿æ ·æ¥è¯´å¤§å®¶åºè¯¥å°±æ´å®¹æçè§£äºã

- **åç´æåçä¼ç¹ï¼** å¯ä»¥ä½¿å¾åæ°æ®åå°ï¼å¨æ¥è¯¢æ¶åå°è¯»åçBlockæ°ï¼åå°I/O次æ°ãæ¤å¤ï¼åç´ååºå¯ä»¥ç®å表çç»æï¼æäºç»´æ¤ã
- **åç´æåç缺ç¹ï¼** 主é®ä¼åºç°åä½ï¼éè¦ç®¡çåä½åï¼å¹¶ä¼å¼èµ·Joinæä½ï¼å¯ä»¥éè¿å¨åºç¨å±è¿è¡Joinæ¥è§£å³ãæ¤å¤ï¼åç´ååºä¼è®©äºå¡å徿´å 夿ï¼
#### 4. æ°´å¹³ååº
**ä¿ææ°æ®è¡¨ç»æä¸åï¼éè¿æç§çç¥å卿°æ®åçãè¿æ ·æ¯ä¸çæ°æ®åæ£å°ä¸åç表æè
åºä¸ï¼è¾¾å°äºåå¸å¼çç®çã æ°´å¹³æåå¯ä»¥æ¯æéå¸¸å¤§çæ°æ®éã**
æ°´å¹³æåæ¯ææ°æ®è¡¨è¡çæåï¼è¡¨çè¡æ°è¶
è¿200ä¸è¡æ¶ï¼å°±ä¼åæ
¢ï¼è¿æ¶å¯ä»¥æä¸å¼ çè¡¨çæ°æ®ææå¤å¼ 表æ¥åæ¾ã举个ä¾åï¼æä»¬å¯ä»¥å°ç¨æ·ä¿¡æ¯è¡¨æåæå¤ä¸ªç¨æ·ä¿¡æ¯è¡¨ï¼è¿æ ·å°±å¯ä»¥é¿å
åä¸è¡¨æ°æ®éè¿å¤§å¯¹æ§è½é æå½±åã

æ°´å¹³æåå¯ä»¥æ¯æéå¸¸å¤§çæ°æ®éãéè¦æ³¨æçä¸ç¹æ¯ï¼å表ä»
ä»
æ¯è§£å³äºåä¸è¡¨æ°æ®è¿å¤§çé®é¢ï¼ä½ç±äºè¡¨çæ°æ®è¿æ¯å¨åä¸å°æºå¨ä¸ï¼å
¶å®å¯¹äºæåMySQLå¹¶åè½å没æä»ä¹æä¹ï¼æä»¥ **æ°´å¹³æåæå¥½ååº** ã
æ°´å¹³æåè½å¤ **æ¯æéå¸¸å¤§çæ°æ®éåå¨ï¼åºç¨ç«¯æ¹é ä¹å°**ï¼ä½ **åçäºå¡é¾ä»¥è§£å³** ï¼è·¨èç¹Joinæ§è½è¾å·®ï¼é»è¾å¤æããJavaå·¥ç¨å¸ä¿®ç¼ä¹éãçä½è
æ¨è **å°½éä¸è¦å¯¹æ°æ®è¿è¡åçï¼å 为æåä¼å¸¦æ¥é»è¾ãé¨ç½²ãè¿ç»´çåç§å¤æåº¦** ï¼ä¸è¬çæ°æ®è¡¨å¨ä¼åå¾å½çæ
åµä¸æ¯æåä¸ä»¥ä¸çæ°æ®éæ¯æ²¡æå¤ªå¤§é®é¢çã妿å®å¨è¦åçï¼å°½é鿩客æ·ç«¯åçæ¶æï¼è¿æ ·å¯ä»¥åå°ä¸æ¬¡åä¸é´ä»¶çç½ç»I/Oã
**ä¸é¢è¡¥å
ä¸ä¸æ°æ®åºåçç两ç§å¸¸è§æ¹æ¡ï¼**
- **客æ·ç«¯ä»£çï¼** **åçé»è¾å¨åºç¨ç«¯ï¼å°è£
å¨jarå
ä¸ï¼éè¿ä¿®æ¹æè
å°è£
JDBC屿¥å®ç°ã** å½å½ç½ç **Sharding-JDBC** ãé¿éçTDDLæ¯ä¸¤ç§æ¯è¾å¸¸ç¨çå®ç°ã
- **ä¸é´ä»¶ä»£çï¼** **å¨åºç¨åæ°æ®ä¸é´å äºä¸ä¸ªä»£çå±ãåçé»è¾ç»ä¸ç»´æ¤å¨ä¸é´ä»¶æå¡ä¸ã** æä»¬ç°å¨è°ç **Mycat** ã360çAtlasãç½æçDDBçç齿¯è¿ç§æ¶æçå®ç°ã
详ç»å
容å¯ä»¥åèï¼ MySQL大表ä¼åæ¹æ¡: [https://segmentfault.com/a/1190000006158186](https://segmentfault.com/a/1190000006158186)
### 䏿¡SQLè¯å¥å¨MySQLä¸å¦ä½æ§è¡ç
[䏿¡SQLè¯å¥å¨MySQLä¸å¦ä½æ§è¡ç](