- [åè¨](#åè¨)
- [第ä¸é¨åï¼MySQLåºç¡](#第ä¸é¨åmysqlåºç¡)
- [MySQLçå¤åå¨å¼ææ¶æ](#mysqlçå¤åå¨å¼ææ¶æ)
- [1. ä»ä¹æ¯äºå¡](#1-ä»ä¹æ¯äºå¡)
- [AUTOCOMMIT](#autocommit)
- [2. æ°æ®åºACID](#2-æ°æ®åºacid)
- [1. ååæ§ï¼Atomicityï¼](#1-ååæ§atomicity)
- [2. ä¸è´æ§ï¼Consistencyï¼](#2-ä¸è´æ§consistency)
- [3. é离æ§ï¼Isolationï¼](#3-é离æ§isolation)
- [4. æä¹
æ§ï¼Durabilityï¼](#4-æä¹
æ§durability)
- [3. æ°æ®åºä¸çèå¼](#3-æ°æ®åºä¸çèå¼)
- [1. 第ä¸èå¼ (1NF)](#1-第ä¸èå¼-1nf)
- [2. 第äºèå¼ (2NF)](#2-第äºèå¼-2nf)
- [3. 第ä¸èå¼ (3NF)](#3-第ä¸èå¼-3nf)
- [4. å¹¶åä¸è´æ§é®é¢](#4-å¹¶åä¸è´æ§é®é¢)
- [1. 丢失修æ¹](#1-丢失修æ¹)
- [2. è读](#2-è读)
- [3. ä¸å¯éå¤è¯»](#3-ä¸å¯éå¤è¯»)
- [4. 幻读](#4-幻读)
- [5. äºå¡é离级å«](#5-äºå¡é离级å«)
- [1. 串è¡å (Serializable)](#1-串è¡å-serializable)
- [2. å¯éå¤è¯» (Repeated Read)](#2-å¯éå¤è¯»-repeated-read)
- [3. 读已æäº¤ (Read Committed)](#3-读已æäº¤-read-committed)
- [4. è¯»æªæäº¤ (Read Uncommitted)](#4-è¯»æªæäº¤-read-uncommitted)
- [6. åå¨å¼æ](#6-åå¨å¼æ)
- [ç®ä»](#ç®ä»)
- [1. MyISAM](#1-myisam)
- [2. InnoDB](#2-innodb)
- [3. CSV](#3-csv)
- [4. Archive](#4-archive)
- [5. Memory](#5-memory)
- [6. Federated](#6-federated)
- [é®ï¼ç¬ç«è¡¨ç©ºé´åç³»ç»è¡¨ç©ºé´åºè¯¥å¦ä½ææ©](#é®ç¬ç«è¡¨ç©ºé´åç³»ç»è¡¨ç©ºé´åºè¯¥å¦ä½ææ©)
- [é®ï¼å¦ä½éæ©åå¨å¼æ](#é®å¦ä½éæ©åå¨å¼æ)
- [é®ï¼MyISAMåInnoDB弿çåºå«](#é®myisamåinnodb弿çåºå«)
- [é®ï¼ä¸ºä»ä¹ä¸å»ºè®® InnoDB 使ç¨äº¿çº§å¤§è¡¨](#é®ä¸ºä»ä¹ä¸å»ºè®®-innodb-使ç¨äº¿çº§å¤§è¡¨)
- [7. MySQLæ°æ®ç±»å](#7-mysqlæ°æ®ç±»å)
- [1. æ´å](#1-æ´å)
- [2. æµ®ç¹æ°](#2-æµ®ç¹æ°)
- [3. å符串](#3-å符串)
- [4. æ¶é´åæ¥æ](#4-æ¶é´åæ¥æ)
- [DATATIME](#datatime)
- [TIMESTAMP](#timestamp)
- [8. ç´¢å¼](#8-ç´¢å¼)
- [1. ç´¢å¼ä½¿ç¨çåºæ¯](#1-ç´¢å¼ä½¿ç¨çåºæ¯)
- [2. B Tree åç](#2-b-tree-åç)
- [B-Tree](#b-tree)
- [B+Tree](#btree)
- [顺åºè®¿é®æé](#顺åºè®¿é®æé)
- [ä¼å¿](#ä¼å¿)
- [3. ç´¢å¼åç±»](#3-ç´¢å¼åç±»)
- [B+Tree ç´¢å¼](#btree-ç´¢å¼)
- [åå¸ç´¢å¼](#åå¸ç´¢å¼)
- [å
¨æç´¢å¼](#å
¨æç´¢å¼)
- [ç©ºé´æ°æ®ç´¢å¼ï¼R-Treeï¼](#ç©ºé´æ°æ®ç´¢å¼r-tree)
- [4. ç´¢å¼çç¹ç¹](#4-ç´¢å¼çç¹ç¹)
- [5. ç´¢å¼çä¼ç¹](#5-ç´¢å¼çä¼ç¹)
- [6. ç´¢å¼ç缺ç¹](#6-ç´¢å¼ç缺ç¹)
- [7. ç´¢å¼å¤±æ](#7-ç´¢å¼å¤±æ)
- [8. å¨ä»ä¹æ
åµä¸éå建ç«ç´¢å¼](#8-å¨ä»ä¹æ
åµä¸éå建ç«ç´¢å¼)
- [9. 为ä»ä¹ç¨B+æ åç´¢å¼èä¸ç¨B-æ æçº¢é»æ ](#9-为ä»ä¹ç¨bæ åç´¢å¼èä¸ç¨b-æ æçº¢é»æ )
- [10. èåç´¢å¼](#10-èåç´¢å¼)
- [1. ä»ä¹æ¯èåç´¢å¼](#1-ä»ä¹æ¯èåç´¢å¼)
- [2. å½åè§å](#2-å½åè§å)
- [3. å建索å¼](#3-å建索å¼)
- [4. ç´¢å¼ç±»å](#4-ç´¢å¼ç±»å)
- [5. å é¤ç´¢å¼](#5-å é¤ç´¢å¼)
- [6. ä»ä¹æ
åµä¸ä½¿ç¨ç´¢å¼](#6-ä»ä¹æ
åµä¸ä½¿ç¨ç´¢å¼)
- [11. 主é®ãå¤é®åç´¢å¼çåºå«](#11-主é®å¤é®åç´¢å¼çåºå«)
- [12. èéç´¢å¼ä¸éèéç´¢å¼](#12-èéç´¢å¼ä¸éèéç´¢å¼)
- [13. æ°æ®åºä¸çå页æ¥è¯¢è¯å¥æä¹åï¼å¦ä½ä¼å](#13-æ°æ®åºä¸çå页æ¥è¯¢è¯å¥æä¹åå¦ä½ä¼å)
- [14. 常ç¨çæ°æ®åºæåªäºï¼Redisç¨è¿åï¼](#14-常ç¨çæ°æ®åºæåªäºredisç¨è¿å)
- [15. Redisçæ°æ®ç»æ](#15-redisçæ°æ®ç»æ)
- [16. ååºå表](#16-ååºå表)
- [1. åç´åå](#1-åç´åå)
- [åç´ååçä¼ç¹](#åç´ååçä¼ç¹)
- [åç´ååç缺ç¹](#åç´ååç缺ç¹)
- [2. æ°´å¹³åå](#2-æ°´å¹³åå)
- [æ°´å¹³ååçä¼ç¹](#æ°´å¹³ååçä¼ç¹)
- [æ°´å¹³ååç缺ç¹](#æ°´å¹³ååç缺ç¹)
- [åç´åååæ°´å¹³ååçå
±åç¹](#åç´åååæ°´å¹³ååçå
±åç¹)
- [3. Sharding çç¥](#3-sharding-çç¥)
- [4. Sharding åå¨çé®é¢åè§£å³æ¹æ¡](#4-sharding-åå¨çé®é¢åè§£å³æ¹æ¡)
- [äºå¡é®é¢](#äºå¡é®é¢)
- [JOIN](#join)
- [ID å¯ä¸æ§](#id-å¯ä¸æ§)
- [17. 主ä»å¤å¶ä¸è¯»åå离](#17-主ä»å¤å¶ä¸è¯»åå离)
- [主ä»å¤å¶](#主ä»å¤å¶)
- [读åå离](#读åå离)
- [18. æ¥è¯¢æ§è½ä¼å](#18-æ¥è¯¢æ§è½ä¼å)
- [1. ä½¿ç¨ Explain è¿è¡åæ](#1-使ç¨-explain-è¿è¡åæ)
- [2. ä¼åæ°æ®è®¿é®](#2-ä¼åæ°æ®è®¿é®)
- [1. åå°è¯·æ±çæ°æ®é](#1-åå°è¯·æ±çæ°æ®é)
- [2. åå°æå¡å¨ç«¯æ«æçè¡æ°](#2-åå°æå¡å¨ç«¯æ«æçè¡æ°)
- [3. éææ¥è¯¢æ¹å¼](#3-éææ¥è¯¢æ¹å¼)
- [1. åå大æ¥è¯¢](#1-åå大æ¥è¯¢)
- [2. åè§£å¤§è¿æ¥æ¥è¯¢](#2-åè§£å¤§è¿æ¥æ¥è¯¢)
- [19. éç±»å](#19-éç±»å)
- [1. ä¹è§é](#1-ä¹è§é)
- [2. æ²è§é](#2-æ²è§é)
- [3. å
±äº«é](#3-å
±äº«é)
- [4. æå®é](#4-æå®é)
- [5. è¡é](#5-è¡é)
- [6. 表é](#6-表é)
- [7. æ»é](#7-æ»é)
- [第äºé¨åï¼é«æ§è½MySQLå®è·µ](#第äºé¨å髿§è½mysqlå®è·µ)
- [1. å¦ä½è§£å³ç§æçæ§è½é®é¢åè¶
åç讨论](#1-å¦ä½è§£å³ç§æçæ§è½é®é¢åè¶
åç讨论)
- [è§£å³æ¹æ¡1](#è§£å³æ¹æ¡1)
- [è§£å³æ¹æ¡2](#è§£å³æ¹æ¡2)
- [è§£å³æ¹æ¡3](#è§£å³æ¹æ¡3)
- [2. æ°æ®åºä¸»ä»ä¸ä¸è´ï¼æä¹è§£](#2-æ°æ®åºä¸»ä»ä¸ä¸è´æä¹è§£)
- [éå½ï¼åèèµæ](#éå½åèèµæ)
# åè¨
卿¬æå°è®¨è®ºæ°æ®åºåçå MySQL æ ¸å¿ç¥è¯ï¼MySQL æ§è½ä¼åçï¼å
å« **MySQLåºç¡** å **髿§è½MySQLå®è·µ** 两é¨åã
åèèµæï¼
- ã髿§è½MySQLã第ä¸ç
- é¨ååèï¼[CyC2018/Interview-Notebook](https://github.com/CyC2018/Interview-Notebook/blob/master/notes/MySQL.md)ï¼ç¹å«é¸£è°¢ä½è
@CyC2018
å¦ä¹ èµæï¼
- ãæ
课ç½ãMySQLæ§è½ç®¡çåæ¶æè®¾è®¡
- ã龿å¦é¢ãMySQL大ååå¸å¼é群
- ãåæ³¡å¦é¢ãæ§è½åæâMySQLé¨å
# 第ä¸é¨åï¼MySQLåºç¡
## MySQLçå¤åå¨å¼ææ¶æ

è¿éå
æä¸ªæ´ä½çMySQL Serverçæ´ä½æ¦å¿µï¼è¯¦æ
转åï¼[MySQLçå¤åå¨å¼ææ¶æ](http://zhaox.github.io/2016/06/24/mysql-architecture)
## 1. ä»ä¹æ¯äºå¡

äºå¡æçæ¯æ»¡è¶³ ACID ç¹æ§çä¸ç»æä½ï¼å¯ä»¥éè¿ Commit æäº¤ä¸ä¸ªäºå¡ï¼ä¹å¯ä»¥ä½¿ç¨ Rollback è¿è¡åæ»ã
### AUTOCOMMIT
MySQL é»è®¤ èªå¨æäº¤æ¨¡å¼ãä¹å°±æ¯è¯´ï¼å¦æä¸æ¾å¼ä½¿ç¨ `START TRANSACTION` è¯å¥æ¥å¼å§ä¸ä¸ªäºå¡ï¼é£ä¹æ¯ä¸ªæ¥è¯¢é½ä¼è¢«å½åä¸ä¸ªäºå¡èªå¨æäº¤
## 2. æ°æ®åºACID
### 1. ååæ§ï¼Atomicityï¼
ããååæ§æ¯æäºå¡æ¯ä¸ä¸ªä¸å¯åå²çå·¥ä½åä½ï¼äºå¡ä¸çæä½è¦ä¹å
¨é¨æåï¼è¦ä¹å
¨é¨å¤±è´¥ãæ¯å¦å¨åä¸ä¸ªäºå¡ä¸çSQLè¯å¥ï¼è¦ä¹å
¨é¨æ§è¡æåï¼è¦ä¹å
¨é¨æ§è¡å¤±è´¥ã
ããåæ»å¯ä»¥ç¨æ¥å¿æ¥å®ç°ï¼æ¥å¿è®°å½çäºå¡ææ§è¡çä¿®æ¹æä½ï¼å¨åæ»æ¶ååæ§è¡è¿äºä¿®æ¹æä½å³å¯ã
### 2. ä¸è´æ§ï¼Consistencyï¼
ããäºå¡å¿
é¡»ä½¿æ°æ®åºä»ä¸ä¸ªä¸è´æ§ç¶æåæ¢å°å¦å¤ä¸ä¸ªä¸è´æ§ç¶æã以转账为ä¾åï¼AåB转账ï¼å设转账ä¹åè¿ä¸¤ä¸ªç¨æ·çé±å èµ·æ¥æ»å
±æ¯2000ï¼é£ä¹AåB转账ä¹åï¼ä¸ç®¡è¿ä¸¤ä¸ªè´¦æ·æä¹è½¬ï¼Aç¨æ·çé±åBç¨æ·çé±å èµ·æ¥çæ»é¢è¿æ¯2000ï¼è¿ä¸ªå°±æ¯äºå¡çä¸è´æ§ã
### 3. é离æ§ï¼Isolationï¼
ããéç¦»æ§æ¯å½å¤ä¸ªç¨æ·å¹¶åè®¿é®æ°æ®åºæ¶ï¼æ¯å¦æä½åä¸å¼ 表æ¶ï¼æ°æ®åºä¸ºæ¯ä¸ä¸ªç¨æ·å¼å¯çäºå¡ï¼ä¸è½è¢«å
¶ä»äºå¡çæä½æå¹²æ°ï¼å¤ä¸ªå¹¶åäºå¡ä¹é´è¦ç¸äºé离ã
ããå³è¦è¾¾å°è¿ä¹ä¸ç§ææï¼å¯¹äºä»»æä¸¤ä¸ªå¹¶åçäºå¡ T1 å T2ï¼å¨äºå¡ T1 çæ¥ï¼T2 è¦ä¹å¨ T1 å¼å§ä¹å就已ç»ç»æï¼è¦ä¹å¨ T1 ç»æä¹åæå¼å§ï¼è¿æ ·æ¯ä¸ªäºå¡é½æè§ä¸å°æå
¶ä»äºå¡å¨å¹¶åå°æ§è¡ã
### 4. æä¹
æ§ï¼Durabilityï¼
ãã䏿¦äºå¡æäº¤ï¼åå
¶æåçä¿®æ¹å°ä¼æ°¸è¿ä¿åå°æ°æ®åºä¸ãå³ä½¿ç³»ç»åçå´©æºï¼äºå¡æ§è¡çç»æä¹ä¸è½ä¸¢å¤±ã
ããå¯ä»¥éè¿æ°æ®åºå¤ä»½åæ¢å¤æ¥å®ç°ï¼å¨ç³»ç»åç奿ºæ¶ï¼ä½¿ç¨å¤ä»½çæ°æ®åºè¿è¡æ°æ®æ¢å¤ã
äºå¡ç ACID ç¹æ§æ¦å¿µç®åï¼ä½ä¸æ¯å¾å¥½çè§£ï¼ä¸»è¦æ¯å 为è¿å ä¸ªç¹æ§ä¸æ¯ä¸ç§å¹³çº§å
³ç³»ï¼
- åªææ»¡è¶³ä¸è´æ§ï¼äºå¡çæ§è¡ç»æææ¯æ£ç¡®çã
- 卿 å¹¶åçæ
åµä¸ï¼äºå¡ä¸²è¡æ§è¡ï¼é离æ§ä¸å®è½å¤æ»¡è¶³ãæ¤æ¶è¦åªè¦è½æ»¡è¶³ååæ§ï¼å°±ä¸å®è½æ»¡è¶³ä¸è´æ§ã
- å¨å¹¶åçæ
åµä¸ï¼å¤ä¸ªäºå¡å¹¶åæ§è¡ï¼äºå¡ä¸ä»
è¦æ»¡è¶³ååæ§ï¼è¿éè¦æ»¡è¶³é离æ§ï¼æè½æ»¡è¶³ä¸è´æ§ã
- äºå¡æ»¡è¶³æä¹
åæ¯ä¸ºäºè½åºå¯¹æ°æ®åºå¥æºçæ
åµã

## 3. æ°æ®åºä¸çèå¼
ããæ»¡è¶³æä½è¦æ±çè弿¯ç¬¬ä¸èå¼ï¼1NFï¼ãå¨ç¬¬ä¸èå¼çåºç¡ä¸è¿ä¸æ¥æ»¡è¶³æ´å¤è§èè¦æ±ç称为第äºèå¼ï¼2NFï¼ï¼å
¶ä½èå¼ä»¥æ¬¡ç±»æ¨ãä¸è¬è¯´æ¥ï¼æ°æ®åºåªé满足第ä¸èå¼ (3NFï¼å°±è¡äºã
ããèå¼çå
å«å
³ç³»ãä¸ä¸ªæ°æ®åºè®¾è®¡å¦æç¬¦å第äºèå¼ï¼ä¸å®ä¹ç¬¦å第ä¸èå¼ãå¦æç¬¦å第ä¸èå¼ï¼ä¸å®ä¹ç¬¦å第äºèå¼â¦
- 1NFï¼å±æ§ä¸å¯å
- 2NFï¼å±æ§å®å
¨ä¾èµäºä¸»é® [æ¶é¤é¨åå彿°ä¾èµ]
- 3NFï¼å±æ§ä¸ä¾èµäºå
¶å®é䏻屿§ [æ¶é¤ä¼ éä¾èµ]
- BCNFï¼å·´æ¯-ç§å¾·èå¼ï¼ï¼å¨1NFåºç¡ä¸ï¼ä»»ä½é䏻屿§ä¸è½å¯¹ä¸»é®åéä¾èµ[å¨3NFåºç¡ä¸æ¶é¤å¯¹ä¸»ç åéçä¾èµ]
- 4NFï¼è¦æ±æåä¸è¡¨å
çå¤å¯¹å¤å
³ç³»å é¤ã
- 5NFï¼å®ç¾èå¼ï¼ï¼ä»æç»ç»æéæ°å»ºç«åå§ç»æã
èå¼ç论æ¯ä¸ºäºè§£å³ä»¥ä¸æå°åç§å¼å¸¸ã
é«çº§å«èå¼çä¾èµäºä½çº§å«çèå¼ï¼1NF æ¯æä½çº§å«çèå¼ã

### 1. 第ä¸èå¼ (1NF)
屿§ä¸å¯åã
### 2. 第äºèå¼ (2NF)
æ¯ä¸ªé䏻屿§å®å
¨å½æ°ä¾èµäºé®ç ã
å¯ä»¥éè¿åè§£æ¥æ»¡è¶³ã
**åè§£å**
| Sno | Sname | Sdept | Mname | Cname | Grade |
| ---- | ------ | ------ | ------ | ------ | ----- |
| 1 | å¦ç-1 | å¦é¢-1 | é¢é¿-1 | 课ç¨-1 | 90 |
| 2 | å¦ç-2 | å¦é¢-2 | é¢é¿-2 | 课ç¨-2 | 80 |
| 2 | å¦ç-2 | å¦é¢-2 | é¢é¿-2 | 课ç¨-1 | 100 |
| 3 | å¦ç-3 | å¦é¢-2 | é¢é¿-2 | 课ç¨-2 | 95 |
以ä¸å¦ç课ç¨å
³ç³»ä¸ï¼{Sno, Cname} 为é®ç ï¼æå¦ä¸å½æ°ä¾èµï¼
- Sno -> Sname, Sdept
- Sdept -> Mname
- Sno, Cname-> Grade
Grade å®å
¨å½æ°ä¾èµäºé®ç ï¼å®æ²¡æä»»ä½å使°æ®ï¼æ¯ä¸ªå¦ççæ¯é¨è¯¾é½æç¹å®çæç»©ã
Sname, Sdept å Mname é½é¨åä¾èµäºé®ç ï¼å½ä¸ä¸ªå¦çéä¿®äºå¤é¨è¯¾æ¶ï¼è¿äºæ°æ®å°±ä¼åºç°å¤æ¬¡ï¼é æå¤§éå使°æ®ã
**åè§£å**
å
³ç³»-1
| Sno | Sname | Sdept | Mname |
| ---- | ------ | ------ | ------ |
| 1 | å¦ç-1 | å¦é¢-1 | é¢é¿-1 |
| 2 | å¦ç-2 | å¦é¢-2 | é¢é¿-2 |
| 3 | å¦ç-3 | å¦é¢-2 | é¢é¿-2 |
æä»¥ä¸å½æ°ä¾èµï¼
- Sno -> Sname, Sdept
- Sdept -> Mname
å
³ç³»-2
| Sno | Cname | Grade |
| ---- | ------ | ----- |
| 1 | 课ç¨-1 | 90 |
| 2 | 课ç¨-2 | 80 |
| 2 | 课ç¨-1 | 100 |
| 3 | 课ç¨-2 | 95 |
æä»¥ä¸å½æ°ä¾èµï¼
- Sno, Cname -> Grade
### 3. 第ä¸èå¼ (3NF)
é䏻屿§ä¸ä¼ é彿°ä¾èµäºé®ç ã
ä¸é¢ç å
³ç³»-1 ä¸åå¨ä»¥ä¸ä¼ é彿°ä¾èµï¼
- Sno -> Sdept -> Mname
å¯ä»¥è¿è¡ä»¥ä¸åè§£ï¼
å
³ç³»-11
| Sno | Sname | Sdept |
| ---- | ------ | ------ |
| 1 | å¦ç-1 | å¦é¢-1 |
| 2 | å¦ç-2 | å¦é¢-2 |
| 3 | å¦ç-3 | å¦é¢-2 |
å
³ç³»-12
| Sdept | Mname |
| ------ | ------ |
| å¦é¢-1 | é¢é¿-1 |
| å¦é¢-2 | é¢é¿-2 |
## 4. å¹¶åä¸è´æ§é®é¢
### 1. 丢失修æ¹
ãã T1 å T2 两个äºå¡é½å¯¹ä¸ä¸ªæ°æ®è¿è¡ä¿®æ¹ï¼T1 å
ä¿®æ¹ï¼T2 éåä¿®æ¹ï¼T2 çä¿®æ¹è¦çäº T1 çä¿®æ¹ã

### 2. è读
ãã ï¼éå¯¹æªæäº¤æ°æ®ï¼å¦æä¸ä¸ªäºå¡ä¸å¯¹æ°æ®è¿è¡äºæ´æ°ï¼ä½**äºå¡è¿æ²¡ææäº¤**ï¼å¦ä¸ä¸ªäºå¡å¯ä»¥ âçå°â 该äºå¡æ²¡ææäº¤çæ´æ°ç»æï¼è¿æ ·é æçé®é¢å°±æ¯ï¼å¦æç¬¬ä¸ä¸ªäºå¡åæ»ï¼é£ä¹ï¼ç¬¬äºä¸ªäºå¡å¨æ¤ä¹åæ âçå°â çæ°æ®å°±æ¯ä¸ç¬èæ°æ®ã **ï¼è读åç§°æ ææ°æ®è¯»åºãä¸ä¸ªäºå¡è¯»åå¦å¤ä¸ä¸ªäºå¡è¿æ²¡ææäº¤çæ°æ®å«è读ã ï¼**
**ä¾åï¼**
ããMary çåå·¥èµä¸º 1000, è´¢å¡äººåå° Mary çå·¥èµæ¹ä¸ºäº 8000 (使ªæäº¤äºå¡)
ããMary 读åèªå·±çå·¥èµï¼åç°èªå·±çå·¥èµåä¸ºäº 8000ï¼æ¬¢å¤©åå°ï¼
ããèè´¢å¡åç°æä½æè¯¯ï¼åæ»äºäºå¡ï¼Mary çå·¥èµåå为äº1000
ããåè¿æ ·ï¼Maryè®°åçå·¥èµæ°8000æ¯ä¸ä¸ªèæ°æ®ã
**è§£å³åæ³**ï¼
ããææ°æ®åºçäºå¡é离级å«è°æ´å° READ_COMMITTED
**å¾è§£ï¼**
ããT1 ä¿®æ¹ä¸ä¸ªæ°æ®ï¼T2 éå读åè¿ä¸ªæ°æ®ã妿 T1 æ¤éäºè¿æ¬¡ä¿®æ¹ï¼é£ä¹ T2 读åçæ°æ®æ¯èæ°æ®ã

### 3. ä¸å¯éå¤è¯»
ããæ¯æå¨ä¸ä¸ªäºå¡å
ï¼å¤æ¬¡è¯»å䏿°æ®ãå¨è¿ä¸ªäºå¡è¿æ²¡æç»ææ¶ï¼å¦å¤ä¸ä¸ªäºå¡ä¹è®¿é®è¯¥å䏿°æ®ãé£ä¹ï¼å¨ç¬¬ä¸ä¸ªäºå¡ä¸çä¸¤æ¬¡è¯»æ°æ®ä¹é´ï¼ç±äºç¬¬äºä¸ªäºå¡çä¿®æ¹ï¼é£ä¹ç¬¬ä¸ä¸ªäºå¡ä¸¤æ¬¡è¯»å°ççæ°æ®å¯è½æ¯ä¸ä¸æ ·çãè¿æ ·å¨ä¸ä¸ªäºå¡å
两次读å°çæ°æ®æ¯ä¸ä¸æ ·çï¼å æ¤ç§°ä¸ºæ¯ä¸å¯éå¤è¯»ã**ï¼åæ¶æä½ï¼äºå¡1åå«è¯»åäºå¡2æä½æ¶åæäº¤åçæ°æ®ï¼è¯»åçè®°å½å
容ä¸ä¸è´ãä¸å¯éå¤è¯»æ¯æå¨åä¸ä¸ªäºå¡å
ï¼ä¸¤ä¸ªç¸åçæ¥è¯¢è¿åäºä¸åçç»æã ï¼**
**ä¾åï¼**
ï¼1ï¼å¨äºå¡1ä¸ï¼Mary 读åäºèªå·±çå·¥èµä¸º1000ï¼æä½å¹¶æ²¡æå®æ
```sql
con1 = getConnection();
select salary from employee empId ="Mary";
```
ï¼2ï¼å¨äºå¡2ä¸ï¼è¿æ¶è´¢å¡äººåä¿®æ¹äº Mary çå·¥èµä¸º 2000ï¼å¹¶æäº¤äºäºå¡.
```sql
con2 = getConnection();
update employee set salary = 2000;
con2.commit();
```
ï¼3ï¼å¨äºå¡1ä¸ï¼Mary 忬¡è¯»åèªå·±çå·¥èµæ¶ï¼å·¥èµå为äº2000
```sql
//con1
select salary from employee empId ="Mary";
```
å¨ä¸ä¸ªäºå¡ä¸åå两次读åçç»æå¹¶ä¸è´ï¼å¯¼è´äºä¸å¯éå¤è¯»ã
**è§£å³åæ³**ï¼
ããå¦æåªæå¨ä¿®æ¹äºå¡å®å
¨æäº¤ä¹åæå¯ä»¥è¯»åæ°æ®ï¼åå¯ä»¥é¿å
该é®é¢ãææ°æ®åºçäºå¡é离级å«è°æ´å°REPEATABLE_READ
**å¾è§£ï¼**
ããT2 读åä¸ä¸ªæ°æ®ï¼T1 å¯¹è¯¥æ°æ®åäºä¿®æ¹ã妿 T2 忬¡è¯»åè¿ä¸ªæ°æ®ï¼æ¤æ¶è¯»åçç»æåç¬¬ä¸æ¬¡è¯»åçç»æä¸åã

### 4. 幻读
ããäºå¡ T1 读å䏿¡æå®ç Where å奿è¿åçç»æéï¼ç¶å T2 äºå¡æ°æå
¥ä¸è¡è®°å½ï¼è¿è¡è®°å½æ°å¥½å¯ä»¥æ»¡è¶³T1 æä½¿ç¨çæ¥è¯¢æ¡ä»¶ãç¶å T1 忬¡å¯¹è¡¨è¿è¡æ£ç´¢ï¼ä½åçå°äº T2 æå
¥çæ°æ®ã **ï¼åå¯éå¤è¯»ç±»ä¼¼ï¼ä½æ¯äºå¡ T2 çæ°æ®æä½ä»
ä»
æ¯æå
¥åå é¤ï¼ä¸æ¯ä¿®æ¹æ°æ®ï¼è¯»åçè®°å½æ°éååä¸ä¸è´ï¼**
幻读çéç¹å¨äºæ°å¢æè
å é¤ (æ°æ®æ¡æ°åå)
åæ ·çæ¡ä»¶ï¼ç¬¬1次å第2æ¬¡è¯»åºæ¥çè®°å½æ°ä¸ä¸æ ·
**ä¾åï¼**
ç®åå·¥èµä¸º1000çåå·¥æ10人ã
ï¼1ï¼äºå¡1ï¼è¯»åææå·¥èµä¸º 1000 çåå·¥ï¼å
±è¯»å 10 æ¡è®°å½ ï¼
```sql
con1 = getConnection();
Select * from employee where salary =1000;
```
ï¼2ï¼è¿æ¶å¦ä¸ä¸ªäºå¡å employee 表æå
¥äºä¸æ¡å工记å½ï¼å·¥èµä¹ä¸º 1000
```sql
con2 = getConnection();
Insert into employee(empId,salary) values("Lili",1000);
con2.commit();
```
äºå¡1忬¡è¯»åææå·¥èµä¸º 1000ç åå·¥ï¼å
±è¯»åå°äº 11 æ¡è®°å½ï¼è¿å°±å产çäºå¹»è¯»ï¼
```sql
//con1
select * from employee where salary =1000;
```
**è§£å³åæ³ï¼**
ãã妿卿ä½äºå¡å®ææ°æ®å¤çä¹åï¼ä»»ä½å
¶ä»äºå¡é½ä¸å¯ä»¥æ·»å æ°æ°æ®ï¼åå¯é¿å
该é®é¢ãææ°æ®åºçäºå¡é离级å«è°æ´å° SERIALIZABLE_READ
**å¾è§£ï¼**
ããT1 读åæä¸ªèå´çæ°æ®ï¼T2 å¨è¿ä¸ªèå´å
æå
¥æ°çæ°æ®ï¼T1 忬¡è¯»åè¿ä¸ªèå´çæ°æ®ï¼æ¤æ¶è¯»åçç»æååç¬¬ä¸æ¬¡è¯»åçç»æä¸åã

## 5. äºå¡é离级å«
### 1. 串è¡å (Serializable)
ããææäºå¡ä¸ä¸ªæ¥çä¸ä¸ªçæ§è¡ï¼è¿æ ·å¯ä»¥é¿å
幻读 (phantom read)ï¼å¯¹äºåºäºéæ¥å®ç°å¹¶åæ§å¶çæ°æ®åºæ¥è¯´ï¼ä¸²è¡åè¦æ±å¨æ§è¡èå´æ¥è¯¢çæ¶åï¼éè¦è·åèå´éï¼å¦æä¸æ¯åºäºéå®ç°å¹¶åæ§å¶çæ°æ®åºï¼åæ£æ¥å°æè¿åä¸²è¡æä½çäºå¡æ¶ï¼éåæ»è¯¥äºå¡ã
### 2. å¯éå¤è¯» (Repeated Read)
ããææè¢« Select è·åçæ°æ®é½ä¸è½è¢«ä¿®æ¹ï¼è¿æ ·å°±å¯ä»¥é¿å
ä¸ä¸ªäºå¡ååè¯»åæ°æ®ä¸ä¸è´çæ
åµã使¯å´æ²¡æåæ³æ§å¶å¹»è¯»ï¼å 为è¿ä¸ªæ¶åå
¶ä»äºå¡ä¸è½æ´æ¹æéçæ°æ®ï¼ä½æ¯å¯ä»¥å¢å æ°æ®ï¼å³åä¸ä¸ªäºå¡æè¯»é使¯æ²¡æèå´éï¼ä¸ºä»ä¹å«åå¯éå¤è¯»ç级å¢ï¼é£æ¯å 为该ç级解å³äºä¸é¢çä¸å¯éå¤è¯»é®é¢ã
ããå¼ç³ï¼ç°å¨ä¸»æµæ°æ®åºé½ä½¿ç¨ MVCC å¹¶åæ§å¶ï¼ä½¿ç¨ä¹åRRï¼å¯éå¤è¯»ï¼é离级å«ä¸æ¯ä¸ä¼åºç°å¹»è¯»çç°è±¡ã
### 3. 读已æäº¤ (Read Committed)
ãã被读åçæ°æ®å¯ä»¥è¢«å
¶ä»äºå¡ä¿®æ¹ï¼è¿æ ·å¯è½å¯¼è´ä¸å¯éå¤è¯»ãä¹å°±æ¯è¯´ï¼äºå¡è¯»åçæ¶åè·å读éï¼ä½æ¯å¨è¯»å®ä¹åç«å³éæ¾(ä¸éè¦çäºå¡ç»æ)ï¼èåé忝äºå¡æäº¤ä¹åæéæ¾ï¼éæ¾è¯»éä¹åï¼å°±å¯è½è¢«å
¶ä»äºå¡ä¿®æ¹æ°æ®ã该ççº§ä¹æ¯ SQL Server é»è®¤çé离ç级ã
### 4. è¯»æªæäº¤ (Read Uncommitted)
ããæä½çé离ç级ï¼å
许å
¶ä»äºå¡çå°æ²¡ææäº¤çæ°æ®ï¼ä¼å¯¼è´è读ã
**æ»ç»**
- å个级å«éæ¸å¢å¼ºï¼æ¯ä¸ªçº§å«è§£å³ä¸ä¸ªé®é¢ï¼æ¯ä¸ªçº§å«è§£å³ä¸ä¸ªé®é¢ï¼äºå¡çº§å«éå°ï¼æ§è½è¶å·®ï¼å¤§å¤æ°ç¯å¢(Read committed å°±å¯ä»¥ç¨äº)
| éç¦»çº§å« | è读 | ä¸å¯éå¤è¯» | 幻影读 |
| -------- | ---- | ---------- | ------ |
| æªæäº¤è¯» | â | â | â |
| æäº¤è¯» | à | â | â |
| å¯éå¤è¯» | à | à | â |
| å¯ä¸²è¡å | à | à | à |
## 6. åå¨å¼æ
ãã对äºåå¦è
æ¥è¯´æä»¬é常ä¸å
³æ³¨åå¨å¼æï¼ä½æ¯ MySQL æä¾äºå¤ä¸ªåå¨å¼æï¼å
æ¬å¤çäºå¡å®å
¨è¡¨ç弿åå¤çéäºå¡å®å
¨è¡¨ç弿ãå¨ MySQL ä¸ï¼ä¸éè¦å¨æ´ä¸ªæå¡å¨ä¸ä½¿ç¨åä¸ç§åå¨å¼æï¼é对å
·ä½çè¦æ±ï¼å¯ä»¥å¯¹æ¯ä¸ä¸ªè¡¨ä½¿ç¨ä¸åçåå¨å¼æã
### ç®ä»
ããMySQL ä¸çæ°æ®ç¨åç§ä¸åçææ¯åå¨å¨æä»¶ï¼æè
å
åï¼ä¸ãè¿äºææ¯ä¸çæ¯ä¸ç§ææ¯é½ä½¿ç¨ä¸åçå卿ºå¶ãç´¢å¼æå·§ãé宿°´å¹³å¹¶ä¸æç»æä¾å¹¿æ³çä¸åçåè½åè½åãéè¿éæ©ä¸åçææ¯ï¼ä½ è½å¤è·å¾é¢å¤çé度æè
åè½ï¼ä»èæ¹åä½ çåºç¨çæ´ä½åè½ãåå¨å¼æè¯´ç½äºå°±æ¯å¦ä½å卿°æ®ãå¦ä½ä¸ºåå¨çæ°æ®å»ºç«ç´¢å¼åå¦ä½æ´æ°ãæ¥è¯¢æ°æ®çææ¯çå®ç°æ¹æ³ã
ããä¾å¦ï¼å¦æä½ å¨ç 究大éçä¸´æ¶æ°æ®ï¼ä½ ä¹è®¸éè¦ä½¿ç¨å
ååå¨å¼æãå
ååå¨å¼æè½å¤å¨å
åä¸å卿æçè¡¨æ ¼æ°æ®ãåæè
ï¼ä½ ä¹è®¸éè¦ä¸ä¸ªæ¯æäºå¡å¤ççæ°æ®åºï¼ä»¥ç¡®ä¿äºå¡å¤çä¸æåæ¶æ°æ®çåéè½åï¼ã
> å¨MySQL䏿å¾å¤åå¨å¼æï¼æ¯ç§åå¨å¼æå¤§ç¸å¾åºï¼é£ä¹åæ¹å¦ä½éæ©å¢ï¼
ãã`MySQL 5.5` 以åçé»è®¤åå¨å¼ææ¯ `MyISAM`, `MySQL 5.5` ä¹åçé»è®¤åå¨å¼ææ¯ `InnoDB`
ããä¸ååå¨å¼èµ·é½æåèªçç¹ç¹ï¼ä¸ºéåºä¸åçéæ±ï¼éè¦éæ©ä¸åçåå¨å¼æï¼æä»¥é¦å
èèè¿äºåå¨å¼æåèªçåè½åå
¼å®¹ã
### 1. MyISAM
MySQL 5.5 çæ¬ä¹åçé»è®¤åå¨å¼æï¼å¨ `5.0` 以åæå¤§è¡¨åå¨ç©ºé´æå¤§ `4G`ï¼`5.0` 以åæå¤§ `256TB`ã
Myisam åå¨å¼æç± `.myd`ï¼æ°æ®ï¼å `.myi`ï¼ç´¢å¼æä»¶ï¼ç»æï¼`.frm`æä»¶åå¨è¡¨ç»æï¼æä»¥åå¨å¼æé½æï¼
**ç¹æ§**
- å¹¶åæ§åéçº§å« ï¼å¯¹äºè¯»åæ··åçæä½ä¸å¥½ï¼ä¸ºè¡¨çº§éï¼åå
¥åè¯»äºæ¥ï¼
- 表æåä¿®å¤
- Myisam è¡¨æ¯æçç´¢å¼ç±»åï¼å
¨æç´¢å¼ï¼
- Myisam æ¯æè¡¨å缩ï¼å缩åï¼æ¤è¡¨ä¸ºåªè¯»ï¼ä¸å¯ä»¥åå
¥ãä½¿ç¨ myisampack å缩ï¼
**åºç¨åºæ¯**
- 没æäºå¡
- åªè¯»ç±»åºç¨ï¼æå
¥ä¸é¢ç¹ï¼æ¥è¯¢é常é¢ç¹ï¼
- 空é´ç±»åºç¨ï¼å¯ä¸æ¯æç©ºé´å½æ°ç弿ï¼
- åå¾å¤ count ç计ç®
### 2. InnoDB
MySQL 5.5 åä¹åçæ¬çé»è®¤åå¨å¼æ
**ç¹æ§**
- InnoDB为äºå¡æ§åå¨å¼æ
- å®å
¨æ¯æäºç©ç ACID ç¹æ§
- Redo log ï¼å®ç°äºå¡çæä¹
æ§ï¼ å Undo logï¼ä¸ºäºå®ç°äºå¡çååæ§ï¼å卿ªå®æäºå¡logï¼ç¨äºåæ»ï¼
- InnoDBæ¯æè¡çº§é
- è¡çº§éå¯ä»¥æå¤§ç¨åº¦çæ¯æå¹¶å
- è¡çº§éæ¯ç±åå¨å¼æå±å®ç°ç
**åºç¨åºæ¯**
- å¯é æ§è¦æ±æ¯è¾é«ï¼æè
è¦æ±äºå¡
- è¡¨æ´æ°åæ¥è¯¢é½ç¸å½çé¢ç¹ï¼å¹¶ä¸è¡éå®çæºä¼æ¯è¾å¤§çæ
åµã
### 3. CSV
**æä»¶ç³»ç»åå¨ç¹ç¹**
- æ°æ®ä»¥ææ¬æ¹å¼åå¨å¨æä»¶ä¸
- `.csv`æä»¶åå¨è¡¨å
容
- `.csm`æä»¶åå¨è¡¨çå
æ°æ®ï¼å¦è¡¨ç¶æåæ°æ®é
- `.frm`åå¨è¡¨çç»æ
**CSVåå¨å¼æç¹ç¹**
- 以 CSV æ ¼å¼è¿è¡æ°æ®åå¨
- ææåå¿
须齿¯ä¸è½ä¸º NULL
- 䏿¯æç´¢å¼
- å¯ä»¥å¯¹æ°æ®æä»¶ç´æ¥ç¼è¾ï¼å
¶ä»å¼ææ¯äºè¿å¶åå¨ï¼ä¸å¯ç¼è¾ï¼
**å¼ç¨åºæ¯**
- ä½ä¸ºæ°æ®äº¤æ¢çä¸é´è¡¨
### 4. Archive
**ç¹æ§**
- 以 zlib å¯¹è¡¨æ°æ®è¿è¡å缩ï¼ç£ç I/O æ´å°
- æ°æ®åå¨å¨ARZ为åç¼çæä»¶ä¸ï¼è¡¨æä»¶ä¸º `a.arz`ï¼`a.frm`ï¼
- åªæ¯æ insert å select æä½ï¼ä¸å¯ä»¥ delete å updateï¼ä¼æç¤ºæ²¡æè¿ä¸ªåè½ï¼
- åªå
许å¨èªå¢IDåä¸å ç´¢å¼
**åºç¨åºæ¯**
- æ¥å¿åæ°æ®ééç±»åºç¨
### 5. Memory
ç¹æ§
- ä¹ç§°ä¸º HEAP åå¨å¼æï¼æä»¥æ°æ®ä¿åå¨å
åä¸ï¼æ°æ®åºéå¯åä¼å¯¼è´æ°æ®ä¸¢å¤±ï¼
- æ¯æ HASH ç´¢å¼ï¼ç弿¥æ¾åºéæ© HASHï¼å BTree ç´¢å¼ï¼èå´æ¥æ¾åºéæ©ï¼
- ææå段é½ä¸ºåºå®é¿åº¦ï¼varchar(10) == char(10)
- 䏿¯æ BLOG å TEXT ç大忮µ
- Memory åå¨ä½¿ç¨è¡¨çº§éï¼æ§è½å¯è½ä¸å¦ innodbï¼
- æå¤§å¤§å°ç± `max_heap_table_size` åæ°å³å®
- Memoryåå¨å¼æé»è®¤è¡¨å¤§å°åªæ `16M`ï¼å¯ä»¥éè¿è°æ´ `max_heap_table_size` åæ°
åºç¨åºæ¯
- ç¨äºæ¥æ¾ææ¯æ å°è¡¨ï¼ä¾å¦å³è¾¹åå°åºç对åºè¡¨
- ç¨äºä¿åæ°æ®åæä¸äº§ççä¸é´è¡¨
- ç¨äºç¼å卿æ§èåæ°æ®çç»æè¡¨
**注æï¼** Memory æ°æ®æä¸¢å¤±ï¼æä»¥è¦æ±æ°æ®å¯åç
### 6. Federated
**ç¹æ§**
- æä¾äºè®¿é®è¿ç¨ MySQL æå¡å¨ä¸è¡¨çæ¹æ³
- æ¬å°ä¸å卿°æ®ï¼æ°æ®å
¨é¨æ¾å¨è¿ç¨æå¡å¨ä¸
**ä½¿ç¨ Federated**
é»è®¤æ¯ç¦æ¢çã妿éè¦å¯ç¨ï¼éè¦å¨å¯å¨æ¶å¢å Federatedåæ°
### é®ï¼ç¬ç«è¡¨ç©ºé´åç³»ç»è¡¨ç©ºé´åºè¯¥å¦ä½ææ©
**两è
æ¯è¾**
- ç³»ç»è¡¨ç©ºé´ï¼æ æ³ç®åçæ¶ç¼©å¤§å°ï¼è¿å¾ææï¼ä¼å¯¼è´ ibdata1 ä¸ç´å¢å¤§ï¼å³ä½¿å é¤äºæ°æ®ä¹ä¸ä¼åå°ï¼
- ç¬ç«è¡¨ç©ºé´ï¼å¯ä»¥éè¿ optimize table å½ä»¤æ¶ç¼©ç³»ç»æä»¶
- ç³»ç»è¡¨ç©ºé´ï¼ä¼äº§çI/Oç¶é¢ï¼å ä¸ºåªæä¸ä¸ªæä»¶ï¼
- ç¬ç«è¡¨ç©ºé´ï¼å¯ä»¥åå¤ä¸ªæä»¶å·æ°æ°æ®
**æ»ç»**
强ç建议ï¼å¯¹Innodbå¼æä½¿ç¨ç¬ç«è¡¨ç©ºé´ï¼mysql5.6çæ¬ä»¥åé»è®¤æ¯ç¬ç«è¡¨ç©ºé´ï¼
**ç³»ç»è¡¨è½¬ç§»ä¸ºç¬ç«è¡¨çæ¥éª¤ï¼é常ç¹çï¼**
- ä½¿ç¨ mysqldump å¯¼åºæææ°æ®åºè¡¨æ°æ®
- 忢 mysql æå¡ï¼ä¿®æ¹åæ°ï¼å¹¶ä¸å é¤Innodbç¸å
³æä»¶
- éå¯ mysql æå¡ï¼é建mysqlç³»ç»è¡¨ç©ºé´
- 鿰坼å
¥æ°æ®
### é®ï¼å¦ä½éæ©åå¨å¼æ
**åèæ¡ä»¶ï¼**
- æ¯å¦éè¦äºå¡
- æ¯å¦å¯ä»¥çå¤ä»½
- å´©æºæ¢å¤
- åå¨å¼æçç¹æç¹æ§
**éè¦ä¸ç¹ï¼** ä¸è¦æ··å使ç¨åå¨å¼æ
**å¼ºçæ¨èï¼** Innodb
### é®ï¼MyISAMåInnoDB弿çåºå«
**åºå«ï¼**
- MyISAM 䏿¯æå¤é®ï¼è InnoDB æ¯æ
- MyISAM æ¯éäºå¡å®å
¨åçï¼è InnoDB æ¯äºå¡å®å
¨åçã
- MyISAM éçç²åº¦æ¯è¡¨çº§ï¼è InnoDB æ¯æè¡çº§éå®ã
- MyISAM æ¯æå
¨æç±»åç´¢å¼ï¼è InnoDB 䏿¯æå
¨æç´¢å¼ã
- MyISAM ç¸å¯¹ç®åï¼æä»¥å¨æçä¸è¦ä¼äº InnoDBï¼å°ååºç¨å¯ä»¥èèä½¿ç¨ MyISAMã
- MyISAM 表æ¯ä¿åææä»¶çå½¢å¼ï¼å¨è·¨å¹³å°çæ°æ®è½¬ç§»ä¸ä½¿ç¨ MyISAM åå¨ä¼çå»ä¸å°ç麻ç¦ã
- InnoDB è¡¨æ¯ MyISAM 表æ´å®å
¨ï¼å¯ä»¥å¨ä¿è¯æ°æ®ä¸ä¼ä¸¢å¤±çæ
åµä¸ï¼åæ¢éäºå¡è¡¨å°äºå¡è¡¨ï¼alter table tablename type=innodbï¼ã
**åºç¨åºæ¯ï¼**
- MyISAM 管çéäºå¡è¡¨ã宿ä¾é«éåå¨åæ£ç´¢ï¼ä»¥åå
¨ææç´¢è½åã妿åºç¨ä¸éè¦æ§è¡å¤§éç SELECT æ¥è¯¢ï¼é£ä¹ MyISAM æ¯æ´å¥½çéæ©ã
- InnoDB ç¨äºäºå¡å¤çåºç¨ç¨åºï¼å
·æä¼å¤ç¹æ§ï¼å
æ¬ ACID äºå¡æ¯æã妿åºç¨ä¸éè¦æ§è¡å¤§éç INSERT
æ UPDATE æä½ï¼ååºè¯¥ä½¿ç¨ InnoDBï¼è¿æ ·å¯ä»¥æé«å¤ç¨æ·å¹¶åæä½çæ§è½ã
### é®ï¼ä¸ºä»ä¹ä¸å»ºè®® InnoDB 使ç¨äº¿çº§å¤§è¡¨
ä»
使å±å»¶ä¼¸ï¼è¯¦æ
请转åï¼[为ä»ä¹ä¸å»ºè®®innodb使ç¨äº¿çº§å¤§è¡¨ | å³°äºå°±å¥¹äº](http://xiaorui.cc/2016/12/08/%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B8%8D%E5%BB%BA%E8%AE%AEinnodb%E4%BD%BF%E7%94%A8%E4%BA%BF%E7%BA%A7%E5%A4%A7%E8%A1%A8/)
## 7. MySQLæ°æ®ç±»å
### 1. æ´å
| ç±»å | åå¨ | åå¨ | æå°å¼ | æå¤§å¼ |
| --------- | ---- | ---- | ----------------------------- | ----------------------------- |
| | byte | bit | signed | signed |
| TINYINT | 1 | 8 | -27 = -128 | 27-1 = 127 |
| SMALLINT | 2 | 16 | | |
| MEDIUMINT | 3 | 24 | | |
| INT | 4 | 32 | -231 = -2147483648 | 231-1 = 2147483647 |
| BIGINT | 8 | 64 | | |
TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT åå«ä½¿ç¨ 8, 16, 24, 32, 64 ä½åå¨ç©ºé´ï¼ä¸è¬æ
åµä¸è¶å°çåè¶å¥½ã
INT(11) ä¸çæ°ååªæ¯è§å®äºäº¤äºå·¥å
·æ¾ç¤ºå符ç个æ°ï¼å¯¹äºåå¨åè®¡ç®æ¥è¯´æ¯æ²¡ææä¹çã
### 2. æµ®ç¹æ°
FLOAT å DOUBLE 为浮ç¹ç±»åï¼DECIMAL 为é«ç²¾åº¦å°æ°ç±»åãCPU åçæ¯ææµ®ç¹è¿ç®ï¼ä½æ¯ä¸æ¯æ DECIMAl ç±»åç计ç®ï¼å æ¤ DECIMAL çè®¡ç®æ¯æµ®ç¹ç±»åéè¦æ´é«ç代价ã
FLOATãDOUBLE å DECIMAL é½å¯ä»¥æå®å宽ï¼ä¾å¦ DECIMAL(18, 9) 表示æ»å
± 18 ä½ï¼å 9 ä½åå¨å°æ°é¨åï¼å©ä¸ 9 ä½å卿´æ°é¨åã
### 3. å符串
ä¸»è¦æ CHAR å VARCHAR 两ç§ç±»åï¼ä¸ç§æ¯å®é¿çï¼ä¸ç§æ¯åé¿çã
VARCHAR è¿ç§åé¿ç±»åè½å¤èç空é´ï¼å 为åªéè¦åå¨å¿
è¦çå
容ã使¯å¨æ§è¡ UPDATE æ¶å¯è½ä¼ä½¿è¡å徿¯åæ¥é¿ï¼å½è¶
åºä¸ä¸ªé¡µæè½å®¹çº³ç大尿¶ï¼å°±è¦æ§è¡é¢å¤çæä½ãMyISAM ä¼å°è¡ææä¸åççæ®µåå¨ï¼è InnoDB åéè¦åè£é¡µæ¥ä½¿è¡æ¾è¿é¡µå
ã
VARCHAR ä¼ä¿çå符串æ«å°¾çç©ºæ ¼ï¼è CHAR ä¼å é¤ã
### 4. æ¶é´åæ¥æ
MySQL æä¾äºä¸¤ç§ç¸ä¼¼çæ¥ææ¶é´ç±»åï¼DATATIME å TIMESTAMPã
#### DATATIME
è½å¤ä¿åä» 1001 å¹´å° 9999 å¹´çæ¥æåæ¶é´ï¼ç²¾åº¦ä¸ºç§ï¼ä½¿ç¨ 8 åèçåå¨ç©ºé´ã
å®ä¸æ¶åºæ å
³ã
é»è®¤æ
åµä¸ï¼MySQL 以ä¸ç§å¯æåºçãæ æ§ä¹çæ ¼å¼æ¾ç¤º DATATIME å¼ï¼ä¾å¦â2008-01-16 22:37:08âï¼è¿æ¯ ANSI æ åå®ä¹çæ¥æåæ¶é´è¡¨ç¤ºæ¹æ³ã
#### TIMESTAMP
å UNIX æ¶é´æ³ç¸åï¼ä¿åä» 1970 å¹´ 1 æ 1 æ¥åå¤ï¼æ ¼æå¨æ²»æ¶é´ï¼ä»¥æ¥çç§æ°ï¼ä½¿ç¨ 4 个åèï¼åªè½è¡¨ç¤ºä» 1970 å¹´ å° 2038 å¹´ã
å®åæ¶åºæå
³ï¼ä¹å°±æ¯è¯´ä¸ä¸ªæ¶é´æ³å¨ä¸åçæ¶åºæä»£è¡¨çå
·ä½æ¶é´æ¯ä¸åçã
MySQL æä¾äº FROM_UNIXTIME() 彿°æ UNIX æ¶é´æ³è½¬æ¢ä¸ºæ¥æï¼å¹¶æä¾äº UNIX_TIMESTAMP() 彿°ææ¥æè½¬æ¢ä¸º UNIX æ¶é´æ³ã
é»è®¤æ
åµä¸ï¼å¦ææå
¥æ¶æ²¡ææå® TIMESTAMP åçå¼ï¼ä¼å°è¿ä¸ªå¼è®¾ç½®ä¸ºå½åæ¶é´ã
åºè¯¥å°½éä½¿ç¨ TIMESTAMPï¼å ä¸ºå®æ¯ DATETIME ç©ºé´æçæ´é«ã
## 8. ç´¢å¼
### 1. ç´¢å¼ä½¿ç¨çåºæ¯
ç´¢å¼è½å¤è½»æå°æ¥è¯¢æ§è½æåå 个æ°é级ã
1. 对äºé常å°ç表ã大é¨åæ
åµä¸ç®åçå
¨è¡¨æ«ææ¯å»ºç«ç´¢å¼æ´é«æã
2. 对äºä¸å°å¤§åç表ï¼ç´¢å¼å°±é常ææã
3. 使¯å¯¹äºç¹å¤§åç表ï¼å»ºç«åç»´æ¤ç´¢å¼ç代价å°ä¼éä¹å¢é¿ãè¿ç§æ
åµä¸ï¼éè¦ç¨å°ä¸ç§ææ¯å¯ä»¥ç´æ¥åºååºéè¦æ¥è¯¢çä¸ç»æ°æ®ï¼è䏿¯ä¸æ¡è®°å½ä¸æ¡è®°å½å°å¹é
ï¼ä¾å¦å¯ä»¥ä½¿ç¨ååºææ¯ã
ç´¢å¼æ¯å¨åå¨å¼æå±å®ç°çï¼è䏿¯å¨æå¡å¨å±å®ç°çï¼æä»¥ä¸ååå¨å¼æå
·æä¸åçç´¢å¼ç±»ååå®ç°ã
### 2. B Tree åç
#### B-Tree
å®ä¹ä¸æ¡æ°æ®è®°å½ä¸ºä¸ä¸ªäºå
ç» [key, data]ï¼B-Tree æ¯æ»¡è¶³ä¸åæ¡ä»¶çæ°æ®ç»æï¼
- ææå¶èç¹å
·æç¸åçæ·±åº¦ï¼ä¹å°±æ¯è¯´ B-Tree æ¯å¹³è¡¡çï¼
- ä¸ä¸ªèç¹ä¸ç key ä»å·¦å°å³ééåæåï¼
- 妿æä¸ªæéçå·¦å³ç¸é» key å嫿¯ keyi å keyi+1ï¼ä¸ä¸ä¸º nullï¼å该æéæåèç¹çï¼ææ key ⥠keyiï¼ ä¸ï¼key ⤠keyi+1ï¼ã
æ¥æ¾ç®æ³ï¼é¦å
卿 ¹èç¹è¿è¡äºåæ¥æ¾ï¼å¦ææ¾å°åè¿å对åºèç¹ç dataï¼å¦åå¨ç¸åºåºé´çæéæåçèç¹éå½è¿è¡æ¥æ¾ã
ç±äºæå
¥å 餿°çæ°æ®è®°å½ä¼ç ´å B-Tree çæ§è´¨ï¼å æ¤å¨æå
¥å 餿¶ï¼éè¦å¯¹æ è¿è¡ä¸ä¸ªåè£ãåå¹¶ãæè½¬çæä½ä»¥ä¿æ B-Tree æ§è´¨ã
#### B+Tree
ä¸ B-Tree ç¸æ¯ï¼B+Tree æä»¥ä¸ä¸åç¹ï¼
- æ¯ä¸ªèç¹çæéä¸é为 2d è䏿¯ 2d+1ï¼d 为èç¹çåºåº¦ï¼ï¼
- å
èç¹ä¸åå¨ dataï¼åªåå¨ keyï¼
- å¶åèç¹ä¸å卿éã
#### 顺åºè®¿é®æé
ä¸è¬å¨æ°æ®åºç³»ç»ææä»¶ç³»ç»ä¸ä½¿ç¨ç B+Tree ç»æé½å¨ç»å
¸ B+Tree åºç¡ä¸è¿è¡äºä¼åï¼å¨å¶åèç¹å¢å äºé¡ºåºè®¿é®æéï¼åè¿ä¸ªä¼åçç®çæ¯ä¸ºäºæé«åºé´è®¿é®çæ§è½ã
#### ä¼å¿
çº¢é»æ ç平衡æ ä¹å¯ä»¥ç¨æ¥å®ç°ç´¢å¼ï¼ä½æ¯æä»¶ç³»ç»åæ°æ®åºç³»ç»æ®ééç¨ B Tree ä½ä¸ºç´¢å¼ç»æï¼ä¸»è¦æä»¥ä¸ä¸¤ä¸ªåå ï¼
**ï¼ä¸ï¼æ´å°çæ£ç´¢æ¬¡æ°**
å¹³è¡¡æ æ£ç´¢æ°æ®çæ¶é´å¤æåº¦çäºæ é« hï¼èæ é«å¤§è´ä¸º O(h)=O(logdN)ï¼å
¶ä¸ d 为æ¯ä¸ªèç¹çåºåº¦ã
çº¢é»æ çåºåº¦ä¸º 2ï¼è B Tree çåºåº¦ä¸è¬é½é常大ãçº¢é»æ çæ é« h å¾ææ¾æ¯ B Tree 大é常å¤ï¼å æ¤æ£ç´¢ç次æ°ä¹å°±æ´å¤ã
B+Tree ç¸æ¯äº B-Tree æ´éåå¤åç´¢å¼ï¼å 为 B+Tree å
èç¹å»æäº data åï¼å æ¤å¯ä»¥æ¥ææ´å¤§çåºåº¦ï¼æ£ç´¢æç伿´é«ã
**ï¼äºï¼å©ç¨è®¡ç®æºé¢è¯»ç¹æ§**
为äºåå°ç£ç I/Oï¼ç£çå¾å¾ä¸æ¯ä¸¥æ ¼æé读åï¼èæ¯æ¯æ¬¡é½ä¼é¢è¯»ãè¿æ ·åççè®ºä¾æ®æ¯è®¡ç®æºç§å¦ä¸èåçå±é¨æ§åçï¼å½ä¸ä¸ªæ°æ®è¢«ç¨å°æ¶ï¼å
¶éè¿çæ°æ®ä¹é常ä¼é©¬ä¸è¢«ä½¿ç¨ãé¢è¯»è¿ç¨ä¸ï¼ç£çè¿è¡é¡ºåºè¯»åï¼é¡ºåºè¯»åä¸éè¦è¿è¡ç£ç寻éï¼å¹¶ä¸åªéè¦å¾ççæè½¬æ¶é´ï¼å æ¤é度ä¼é常快ã
æä½ç³»ç»ä¸è¬å°å
ååç£çåå²æåºæå¤§å°çåï¼æ¯ä¸å称为ä¸é¡µï¼å
åä¸ç£ç以页为åä½äº¤æ¢æ°æ®ãæ°æ®åºç³»ç»å°ç´¢å¼çä¸ä¸ªèç¹ç大å°è®¾ç½®ä¸ºé¡µç大å°ï¼ä½¿å¾ä¸æ¬¡ I/O å°±è½å®å
¨è½½å
¥ä¸ä¸ªèç¹ï¼å¹¶ä¸å¯ä»¥å©ç¨é¢è¯»ç¹æ§ï¼ç¸é»çèç¹ä¹è½å¤è¢«é¢å
è½½å
¥ã
æ´å¤å
容请åèï¼[MySQL ç´¢å¼èåçæ°æ®ç»æåç®æ³åç](http://blog.codinglabs.org/articles/theory-of-mysql-index.html)
### 3. ç´¢å¼åç±»
| ç¹æ§ | 说æ | InnoDB | MyISAM | MEMORY |
| ---------------------------- | ---------------------------------------------------- | ------ | ------ | ------ |
| Bæ ç´¢å¼ (B-tree indexes) | èªå¢IDç©çè¿ç»æ§æ´é«ï¼
äºåæ ï¼çº¢é»æ é«åº¦ä¸å¯æ§ | â | â | â |
| Ræ ç´¢å¼ (R-tree indexes) | 空é´ç´¢å¼ | | â | |
| åå¸ç´¢å¼ (Hash indexes) | æ æ³åèå´æ¥è¯¢ | â | | â |
| å
¨æç´¢å¼ (Full-text indexes) | | â | â | |
#### B+Tree ç´¢å¼
B+Tree ç´¢å¼æ¯å¤§å¤æ° MySQL åå¨å¼æçé»è®¤ç´¢å¼ç±»åã
å 为ä¸åéè¦è¿è¡å
¨è¡¨æ«æï¼åªéè¦å¯¹æ è¿è¡æç´¢å³å¯ï¼å æ¤æ¥æ¾é度快å¾å¤ãé¤äºç¨äºæ¥æ¾ï¼è¿å¯ä»¥ç¨äºæåºååç»ã
å¯ä»¥æå®å¤ä¸ªåä½ä¸ºç´¢å¼åï¼å¤ä¸ªç´¢å¼åå
±åç»æé®ã
B+Tree ç´¢å¼éç¨äºå
¨é®å¼ãé®å¼èå´åé®åç¼æ¥æ¾ï¼å
¶ä¸é®åç¼æ¥æ¾åªéç¨äºæå·¦åç¼æ¥æ¾ã
妿䏿¯æç
§ç´¢å¼åç顺åºè¿è¡æ¥æ¾ï¼åæ æ³ä½¿ç¨ç´¢å¼ã
InnoDB ç B+Tree ç´¢å¼å为**主索å¼**å**è¾
å©ç´¢å¼**ã
主索å¼çå¶åèç¹ data åè®°å½ç宿´çæ°æ®è®°å½ï¼è¿ç§ç´¢å¼æ¹å¼è¢«ç§°ä¸ºèç°ç´¢å¼ãå ä¸ºæ æ³ææ°æ®è¡åæ¾å¨ä¸¤ä¸ªä¸åçå°æ¹ï¼æä»¥ä¸ä¸ªè¡¨åªè½æä¸ä¸ªèç°ç´¢å¼ã
è¾
å©ç´¢å¼çå¶åèç¹ç data åè®°å½ç主é®çå¼ï¼å æ¤å¨ä½¿ç¨è¾
å©ç´¢å¼è¿è¡æ¥æ¾æ¶ï¼éè¦å
æ¥æ¾å°ä¸»é®å¼ï¼ç¶ååå°ä¸»ç´¢å¼ä¸è¿è¡æ¥æ¾ã
#### åå¸ç´¢å¼
InnoDB 弿æä¸ä¸ªç¹æ®çåè½å« âèªéåºåå¸ç´¢å¼âï¼å½æä¸ªç´¢å¼å¼è¢«ä½¿ç¨çé常é¢ç¹æ¶ï¼ä¼å¨ B+Tree ç´¢å¼ä¹ä¸åå建ä¸ä¸ªåå¸ç´¢å¼ï¼è¿æ ·å°±è®© B+Tree ç´¢å¼å
·æåå¸ç´¢å¼çä¸äºä¼ç¹ï¼æ¯å¦å¿«éçå叿¥æ¾ã
åå¸ç´¢å¼è½ä»¥ O(1) æ¶é´è¿è¡æ¥æ¾ï¼ä½æ¯å¤±å»äºæåºæ§ï¼å®å
·æä»¥ä¸éå¶ï¼
- æ æ³ç¨äºæåºä¸åç»ï¼
- åªæ¯æç²¾ç¡®æ¥æ¾ï¼æ æ³ç¨äºé¨åæ¥æ¾åèå´æ¥æ¾ï¼
#### å
¨æç´¢å¼
MyISAM åå¨å¼ææ¯æå
¨æç´¢å¼ï¼ç¨äºæ¥æ¾ææ¬ä¸çå
³é®è¯ï¼è䏿¯ç´æ¥æ¯è¾æ¯å¦ç¸çãæ¥æ¾æ¡ä»¶ä½¿ç¨ MATCH AGAINSTï¼è䏿¯æ®éç WHEREã
å
¨æç´¢å¼ä¸è¬ä½¿ç¨åæç´¢å¼å®ç°ï¼å®è®°å½çå
³é®è¯å°å
¶æå¨ææ¡£çæ å°ã
InnoDB åå¨å¼æå¨ MySQL 5.6.4 çæ¬ä¸ä¹å¼å§æ¯æå
¨æç´¢å¼ã
#### ç©ºé´æ°æ®ç´¢å¼ï¼R-Treeï¼
MyISAM åå¨å¼ææ¯æç©ºé´æ°æ®ç´¢å¼ï¼å¯ä»¥ç¨äºå°çæ°æ®åå¨ãç©ºé´æ°æ®ç´¢å¼ä¼ä»ææç»´åº¦æ¥ç´¢å¼æ°æ®ï¼å¯ä»¥ææå°ä½¿ç¨ä»»æç»´åº¦æ¥è¿è¡ç»åæ¥è¯¢ã
å¿
é¡»ä½¿ç¨ GIS ç¸å
³ç彿°æ¥ç»´æ¤æ°æ®ã
### 4. ç´¢å¼çç¹ç¹
- å¯ä»¥å å¿«æ°æ®åºçæ£ç´¢é度
- é使°æ®åºæå
¥ãä¿®æ¹ãå é¤çç»´æ¤çé度
- åªè½å建å¨è¡¨ä¸ï¼ä¸è½å建å°è§å¾ä¸
- æ¢å¯ä»¥ç´æ¥å建åå¯ä»¥é´æ¥å建
- å¯ä»¥å¨ä¼åéèä¸ä½¿ç¨ç´¢å¼
- ä½¿ç¨æ¥è¯¢å¤ç卿§è¡SQLè¯å¥ï¼å¨ä¸ä¸ªè¡¨ä¸ï¼ä¸æ¬¡åªè½ä½¿ç¨ä¸ä¸ªç´¢å¼
### 5. ç´¢å¼çä¼ç¹
- å建å¯ä¸æ§ç´¢å¼ï¼ä¿è¯æ°æ®åºè¡¨ä¸æ¯ä¸è¡æ°æ®çå¯ä¸æ§
- 大大å å¿«æ°æ®çæ£ç´¢é度ï¼è¿æ¯å建索å¼çæä¸»è¦çåå
- å éæ°æ®åºè¡¨ä¹é´çè¿æ¥ï¼ç¹å«æ¯å¨å®ç°æ°æ®çåè宿´æ§æ¹é¢ç¹å«ææä¹
- å¨ä½¿ç¨åç»åæåºåå¥è¿è¡æ°æ®æ£ç´¢æ¶ï¼åæ ·å¯ä»¥æ¾èåå°æ¥è¯¢ä¸åç»åæåºçæ¶é´
- éè¿ä½¿ç¨ç´¢å¼ï¼å¯ä»¥å¨æ¥è¯¢ä¸ä½¿ç¨ä¼åéèå¨ï¼æé«ç³»ç»çæ§è½
### 6. ç´¢å¼ç缺ç¹
- å建索å¼åç»´æ¤ç´¢å¼è¦èè´¹æ¶é´ï¼è¿ç§æ¶é´éçæ°æ®éçå¢å èå¢å
- ç´¢å¼éè¦å ç¨ç©ç空é´ï¼é¤äºæ°æ®è¡¨å ç¨æ°æ®ç©ºé´ä¹å¤ï¼æ¯ä¸ä¸ªç´¢å¼è¿è¦å ä¸å®çç©ç空é´ï¼å¦æå»ºç«èç°ç´¢å¼ï¼é£ä¹éè¦ç空é´å°±ä¼æ´å¤§
- å½å¯¹è¡¨ä¸çæ°æ®è¿è¡å¢å ãå é¤åä¿®æ¹çæ¶åï¼ç´¢å¼ä¹éè¦ç»´æ¤ï¼é使°æ®ç»´æ¤çé度
### 7. ç´¢å¼å¤±æ
> ç¾å¢é¢ç»ï¼åªäºæ
åµä¸ä¸ä¼ä½¿ç¨ç´¢å¼ï¼
- 妿MySQL估计使ç¨**å
¨è¡¨æ«ç§æ¯ä½¿ç¨ç´¢å¼å¿«**ï¼åä¸éç¨ç´¢å¼ã
ä¾å¦ï¼å¦æåkeyåååå¸å¨1å100ä¹é´ï¼ä¸é¢çæ¥è¯¢ä½¿ç¨ç´¢å¼å°±ä¸æ¯å¾å¥½ï¼select * from table_name where key>1 and key<90;
- 妿**æ¡ä»¶ä¸æor**ï¼å³ä½¿å
¶ä¸ææ¡ä»¶å¸¦ç´¢å¼ä¹ä¸ä¼ä½¿ç¨
ä¾å¦ï¼select * from table_name where key1='a' or key2='b';妿å¨key1ä¸æç´¢å¼èå¨key2䏿²¡æç´¢å¼ï¼å该æ¥è¯¢ä¹ä¸ä¼èµ°ç´¢å¼
- å¤åç´¢å¼ï¼å¦æç´¢å¼å**䏿¯å¤åç´¢å¼ç第ä¸é¨å**ï¼åä¸ä½¿ç¨ç´¢å¼ï¼å³ä¸ç¬¦åæå·¦åç¼ï¼
ä¾å¦ï¼å¤åç´¢å¼ä¸º(key1,key2),åæ¥è¯¢select * from table_name where key2='b';å°ä¸ä¼ä½¿ç¨ç´¢å¼
- 妿**likeæ¯ä»¥ % å¼å§ç**ï¼å该åä¸çç´¢å¼ä¸ä¼è¢«ä½¿ç¨ã
ä¾å¦select * from table_name where key1 like '%a'ï¼è¯¥æ¥è¯¢å³ä½¿key1ä¸åå¨ç´¢å¼ï¼ä¹ä¸ä¼è¢«ä½¿ç¨å¦æåç±»åæ¯å符串ï¼é£ä¸å®è¦å¨æ¡ä»¶ä¸ä½¿ç¨å¼å·å¼èµ·æ¥ï¼å¦åä¸ä¼ä½¿ç¨ç´¢å¼
- 妿å为å符串ï¼åwhereæ¡ä»¶ä¸å¿
é¡»å°å符常éå¼å å¼å·ï¼å¦åå³ä½¿è¯¥åä¸åå¨ç´¢å¼ï¼ä¹ä¸ä¼è¢«ä½¿ç¨ã
ä¾å¦,select * from table_name where key1=1;妿key1åä¿åçæ¯å符串ï¼å³ä½¿key1ä¸æç´¢å¼ï¼ä¹ä¸ä¼è¢«ä½¿ç¨ã
- å¦æä½¿ç¨MEMORY/HEAP表ï¼å¹¶ä¸whereæ¡ä»¶ä¸ä¸ä½¿ç¨â=âè¿è¡ç´¢å¼åï¼é£ä¹ä¸ä¼ç¨å°ç´¢å¼ï¼headè¡¨åªæå¨â=âçæ¡ä»¶ä¸æä¼ä½¿ç¨ç´¢å¼
### 8. å¨ä»ä¹æ
åµä¸éå建ç«ç´¢å¼
- 为ç»å¸¸åºç°å¨å
³é®åorder byãgroup byãdistinctåé¢çåæ®µï¼å»ºç«ç´¢å¼ã
- å¨unionçéåæä½çç»æéåæ®µä¸ï¼å»ºç«ç´¢å¼ãå
¶å»ºç«ç´¢å¼çç®çåä¸ã
- 为ç»å¸¸ç¨ä½æ¥è¯¢éæ© where åçåæ®µï¼å»ºç«ç´¢å¼ã
- å¨ç»å¸¸ç¨ä½è¡¨è¿æ¥ join ç屿§ä¸ï¼å»ºç«ç´¢å¼ã
- èè使ç¨ç´¢å¼è¦çãå¯¹æ°æ®å¾å°è¢«æ´æ°ç表ï¼å¦æç¨æ·ç»å¸¸åªæ¥è¯¢å
¶ä¸çå ä¸ªåæ®µï¼å¯ä»¥èèå¨è¿å ä¸ªåæ®µä¸å»ºç«ç´¢å¼ï¼ä»èå°è¡¨çæ«ææ¹å为索å¼çæ«æã
æ´å¤èµæï¼[MySQLç´¢å¼èåçæ°æ®ç»æåç®æ³åç](https://www.kancloud.cn/kancloud/theory-of-mysql-index/41846)
## 9. 为ä»ä¹ç¨B+æ åç´¢å¼èä¸ç¨B-æ æçº¢é»æ
B+ æ åªæå¶èç¹åæ¾æ°æ®ï¼å
¶ä½èç¹ç¨æ¥ç´¢å¼ï¼è B- æ æ¯æ¯ä¸ªç´¢å¼èç¹é½ä¼æ Data åãæä»¥ä» InooDB çè§åº¦æ¥çï¼B+ æ æ¯ç¨æ¥å
å½ç´¢å¼çï¼ä¸è¬æ¥è¯´ç´¢å¼é常大ï¼å°¤å
¶æ¯å
³ç³»æ§æ°æ®åºè¿ç§æ°æ®é大çç´¢å¼è½è¾¾å°äº¿çº§å«ï¼æä»¥ä¸ºäºåå°å
åçå ç¨ï¼ç´¢å¼ä¹ä¼è¢«åå¨å¨ç£çä¸ã
- é£ä¹ MySQLå¦ä½è¡¡éæ¥è¯¢æçå¢ï¼çï¼ç£ç IO 次æ°
- B- æ / B+ æ çç¹ç¹å°±æ¯æ¯å±èç¹æ°ç®é常å¤ï¼å±æ°å¾å°ï¼ç®çå°±æ¯ä¸ºäºå°±å°ç£ç IO 次æ°ï¼ä½æ¯ B- æ çæ¯ä¸ªèç¹é½æ data åï¼æéï¼ï¼è¿æ çå¢å¤§äºèç¹å¤§å°ï¼è¯´ç½äºå¢å äºç£ç IO 次æ°ï¼ç£ç IO 䏿¬¡è¯»åºçæ°æ®é大尿¯åºå®çï¼åä¸ªæ°æ®åå¤§ï¼æ¯æ¬¡è¯»åºçå°±å°ï¼IO 次æ°å¢å¤ï¼ä¸æ¬¡ IO å¤èæ¶ï¼ï¼è B+ æ é¤äºå¶åèç¹å
¶å®èç¹å¹¶ä¸å卿°æ®ï¼èç¹å°ï¼ç£ç IO 次æ°å°±å°ã
- B+ æ ææç Data åå¨å¶åèç¹ï¼ä¸è¬æ¥è¯´é½ä¼è¿è¡ä¸ä¸ªä¼åï¼å°±æ¯**å°ææçå¶åèç¹ç¨æé串起æ¥**ãè¿æ ·éåå¶åèç¹å°±è½è·å¾å
¨é¨æ°æ®ï¼è¿æ ·å°±è½è¿è¡åºé´è®¿é®å¦ã卿°æ®åºä¸åºäºèå´çæ¥è¯¢æ¯é常é¢ç¹çï¼è B æ 䏿¯æè¿æ ·çéåæä½ã
- B æ ç¸å¯¹äºçº¢é»æ çåºå«
- **AVL æ åçº¢é»æ åºæ¬é½æ¯åå¨å¨å
å䏿ä¼ä½¿ç¨çæ°æ®ç»æ**ãå¨å¤§è§æ¨¡æ°æ®åå¨çæ¶åï¼çº¢é»æ å¾å¾åºç°ç±äº**æ çæ·±åº¦è¿å¤§**èé æç£ç IO 读åè¿äºé¢ç¹ï¼è¿èå¯¼è´æçä½ä¸çæ
åµã为ä»ä¹ä¼åºç°è¿æ ·çæ
åµï¼æä»¬ç¥éè¦è·åç£ç䏿°æ®ï¼å¿
é¡»å
éè¿ç£çç§»å¨èç§»å¨å°æ°æ®æå¨çæ±é¢ï¼ç¶åæ¾å°æå®çé¢ï¼æ¥çæè½¬ç颿¾å°æ°æ®æå¨çç£éï¼æåå¯¹æ°æ®è¿è¡è¯»åãç£çIO代价主è¦è±è´¹å¨æ¥æ¾æéçæ±é¢ä¸ï¼æ çæ·±åº¦è¿å¤§ä¼é æç£çIOé¢ç¹è¯»åãæ ¹æ®**ç£çæ¥æ¾ååçæ¬¡æ°å¾å¾ç±æ çé«åº¦æå³å®**ï¼æä»¥ï¼åªè¦æä»¬éè¿æç§è¾å¥½çæ ç»æåå°æ çç»æå°½éåå°æ çé«åº¦ï¼Bæ å¯ä»¥æå¤ä¸ªå女ï¼ä»å åå°ä¸åï¼å¯ä»¥é使 çé«åº¦ã
- **æ°æ®åºç³»ç»ç设计è
å·§å¦å©ç¨äºç£çé¢è¯»åç**ï¼å°ä¸ä¸ªèç¹ç大å°è®¾ä¸ºçäºä¸ä¸ªé¡µï¼è¿æ ·æ¯ä¸ªèç¹åªéè¦ä¸æ¬¡ I/O å°±å¯ä»¥å®å
¨è½½å
¥ã为äºè¾¾å°è¿ä¸ªç®çï¼å¨å®é
å®ç° B-Tree è¿éè¦ä½¿ç¨å¦ä¸æå·§ï¼æ¯æ¬¡æ°å»ºèç¹æ¶ï¼ç´æ¥ç³è¯·ä¸ä¸ªé¡µç空é´ï¼è¿æ ·å°±ä¿è¯**ä¸ä¸ªèç¹ç©çä¸ä¹åå¨å¨ä¸ä¸ªé¡µé**ï¼å ä¹è®¡ç®æºåå¨åé
齿¯æé¡µå¯¹é½çï¼å°±å®ç°äºä¸ä¸ª node åªé䏿¬¡ I/Oã
## 10. èåç´¢å¼
### 1. ä»ä¹æ¯èåç´¢å¼
ä¸¤ä¸ªææ´å¤ä¸ªåä¸çç´¢å¼è¢«ç§°ä½èåç´¢å¼ï¼èåç´¢å¼åå«å¤åç´¢å¼ã对äºå¤åç´¢å¼ï¼Mysql ä»å·¦å°å³ç使ç¨ç´¢å¼ä¸çåæ®µï¼ä¸ä¸ªæ¥è¯¢å¯ä»¥åªä½¿ç¨ç´¢å¼ä¸çä¸é¨ä»½ï¼ä½åªè½æ¯æå·¦ä¾§é¨åã
ä¾å¦ç´¢å¼æ¯key index (a,b,c)ï¼å¯ä»¥æ¯æ[a]ã[a,b]ã[a,b,c] 3ç§ç»åè¿è¡æ¥æ¾ï¼ä½ä¸æ¯ [b,c] è¿è¡æ¥æ¾ã彿左侧忮µæ¯å¸¸éå¼ç¨æ¶ï¼ç´¢å¼å°±ååææã
### 2. å½åè§å
1. éè¦å ç´¢å¼çåæ®µï¼è¦å¨ where æ¡ä»¶ä¸
2. æ°æ®éå°çåæ®µä¸éè¦å ç´¢å¼
3. 妿 where æ¡ä»¶ä¸æ¯ORå
³ç³»ï¼å ç´¢å¼ä¸èµ·ä½ç¨
4. 符åæå·¦åå
### 3. å建索å¼
卿§è¡ CREATE TABLE è¯å¥æ¶å¯ä»¥å建索å¼ï¼ä¹å¯ä»¥åç¬ç¨ CREATE INDEX æ ALTER TABLE æ¥ä¸ºè¡¨å¢å ç´¢å¼ã
**ALTER TABLE**
ALTER TABLE ç¨æ¥å建æ®éç´¢å¼ãUNIQUE ç´¢å¼æ PRIMARY KEY ç´¢å¼ã
ä¾å¦ï¼
```mysql
ALTER TABLE table_name ADD INDEX index_name (column_list)
ALTER TABLE table_name ADD UNIQUE (column_list)
ALTER TABLE table_name ADD PRIMARY KEY (column_list)
```
å
¶ä¸ table_name æ¯è¦å¢å ç´¢å¼ç表åï¼column_list æåºå¯¹åªäºåè¿è¡ç´¢å¼ï¼å¤åæ¶ååä¹é´ç¨éå·åéãç´¢å¼å index_name å¯éï¼ç¼ºçæ¶ï¼MySQLå°æ ¹æ®ç¬¬ä¸ä¸ªç´¢å¼åèµä¸ä¸ªåç§°ãå¦å¤ï¼ALTER TABLE å
许å¨å个è¯å¥ä¸æ´æ¹å¤ä¸ªè¡¨ï¼å æ¤å¯ä»¥å¨åæ¶å建å¤ä¸ªç´¢å¼ã
**CREATE INDEX**
CREATE INDEX å¯å¯¹è¡¨å¢å æ®éç´¢å¼æ UNIQUE ç´¢å¼ã
ä¾å¦ï¼
```mysql
CREATE INDEX index_name ON table_name (column_list)
CREATE UNIQUE INDEX index_name ON table_name (column_list)
```
table_nameãindex_name å column_list å
·æä¸ ALTER TABLE è¯å¥ä¸ç¸åçå«ä¹ï¼ç´¢å¼åä¸å¯éãå¦å¤ï¼ä¸è½ç¨ CREATE INDEX è¯å¥å建 PRIMARY KEY ç´¢å¼ã
### 4. ç´¢å¼ç±»å
å¨åå»ºç´¢å¼æ¶ï¼å¯ä»¥è§å®ç´¢å¼è½å¦å
å«éå¤å¼ã妿ä¸å
å«ï¼åç´¢å¼åºè¯¥å建为 PRIMARY KEY æ UNIQUE ç´¢å¼ã对äºååæä¸æ§ç´¢å¼ï¼è¿ä¿è¯ååä¸å
å«éå¤çå¼ã对äºå¤åæä¸æ§ç´¢å¼ï¼ä¿è¯å¤ä¸ªå¼çç»åä¸éå¤ã
PRIMARY KEY ç´¢å¼å UNIQUE ç´¢å¼é常类似ã
äºå®ä¸ï¼PRIMARY KEY ç´¢å¼ä»
æ¯ä¸ä¸ªå
·æåç§° PRIMARY ç UNIQUE ç´¢å¼ãè¿è¡¨ç¤ºä¸ä¸ªè¡¨åªè½å
å«ä¸ä¸ª PRIMARY KEYï¼å 为ä¸ä¸ªè¡¨ä¸ä¸å¯è½å
·æä¸¤ä¸ªååçç´¢å¼ã
ä¸é¢çSQLè¯å¥å¯¹ students è¡¨å¨ sid 䏿·»å PRIMARY KEY ç´¢å¼ã
â ALTER TABLE students ADD PRIMARY KEY (sid)
### 5. å é¤ç´¢å¼
å¯å©ç¨ ALTER TABLE æ DROP INDEX è¯å¥æ¥å é¤ç´¢å¼ãç±»ä¼¼äº CREATE INDEX è¯å¥ï¼DROP INDEX å¯ä»¥å¨ ALTER TABLE å
é¨ä½ä¸ºä¸æ¡è¯å¥å¤çï¼è¯æ³å¦ä¸ã
```mysql
DROP INDEX index_name ON talbe_name
ALTER TABLE table_name DROP INDEX index_name
ALTER TABLE table_name DROP PRIMARY KEY
```
å
¶ä¸ï¼å两æ¡è¯å¥æ¯çä»·çï¼å 餿 table_name ä¸çç´¢å¼ index_nameã
第3æ¡è¯å¥åªå¨å é¤ PRIMARY KEY ç´¢å¼æ¶ä½¿ç¨ï¼å 为ä¸ä¸ªè¡¨åªå¯è½æä¸ä¸ª PRIMARY KEY ç´¢å¼ï¼å æ¤ä¸éè¦æå®ç´¢å¼åãå¦ææ²¡æå建 PRIMARY KEY ç´¢å¼ï¼ä½è¡¨å
·æä¸ä¸ªæå¤ä¸ª UNIQUE ç´¢å¼ï¼å MySQL å°å é¤ç¬¬ä¸ä¸ª UNIQUE ç´¢å¼ã
妿ä»è¡¨ä¸å é¤äºæåï¼åç´¢å¼ä¼åå°å½±åã对äºå¤åç»åçç´¢å¼ï¼å¦æå é¤å
¶ä¸çæåï¼å该åä¹ä¼ä»ç´¢å¼ä¸å é¤ã妿å é¤ç»æç´¢å¼çææåï¼åæ´ä¸ªç´¢å¼å°è¢«å é¤ã
### 6. ä»ä¹æ
åµä¸ä½¿ç¨ç´¢å¼
1. 为äºå¿«éæ¥æ¾å¹é
WHEREæ¡ä»¶çè¡ã
2. 为äºä»èèçæ¡ä»¶ä¸æ¶é¤è¡ã
3. å¦æè¡¨æä¸ä¸ªmultiple-columnç´¢å¼ï¼ä»»ä½ä¸ä¸ªç´¢å¼çæå·¦åç¼å¯ä»¥éè¿ä½¿ç¨ä¼å卿¥æ¥æ¾è¡ã
4. æ¥è¯¢ä¸ä¸å
¶å®è¡¨å
³èçåï¼å段常常建ç«äºå¤é®å
³ç³»
5. æ¥è¯¢ä¸ç»è®¡æåç»ç»è®¡çåæ®µ
- select max(hbs_bh) from zl_yhjbqk
- select qc_bh,count(*) from zl_yhjbqk group by qc_bh
æ´å¤è¯·è½¬åï¼[MySQL-èåç´¢å¼ - ç®ä¹¦](https://www.jianshu.com/p/f65be52d5e2b)
## 11. 主é®ãå¤é®åç´¢å¼çåºå«
| | å®ä¹ | ä½ç¨ | ä¸ªæ° |
| -------- | ---------------------------------------------------- | ------------------------ | ------------------------ |
| **主é®** | å¯ä¸æ è¯ä¸æ¡è®°å½ï¼ä¸è½æéå¤çï¼ä¸å
许为空 | ç¨æ¥ä¿è¯æ°æ®å®æ´æ§ | 主é®åªè½æä¸ä¸ª |
| **å¤é®** | 表çå¤é®æ¯å¦ä¸è¡¨ç主é®ï¼å¤é®å¯ä»¥æéå¤çï¼å¯ä»¥æ¯ç©ºå¼ | ç¨æ¥åå
¶ä»è¡¨å»ºç«èç³»ç¨ç | ä¸ä¸ªè¡¨å¯ä»¥æå¤ä¸ªå¤é® |
| **ç´¢å¼** | è¯¥åæ®µæ²¡æéå¤å¼ï¼ä½å¯ä»¥æä¸ä¸ªç©ºå¼ | æ¯æé«æ¥è¯¢æåºçé度 | ä¸ä¸ªè¡¨å¯ä»¥æå¤ä¸ªæä¸ç´¢å¼ |
## 12. èéç´¢å¼ä¸éèéç´¢å¼
https://www.cnblogs.com/s-b-b/p/8334593.html
èéç´¢å¼ä¸å®æ¯å¯ä¸ç´¢å¼ãä½å¯ä¸ç´¢å¼ä¸ä¸å®æ¯èéç´¢å¼ã
èéç´¢å¼ï¼å¨ç´¢å¼é¡µéç´æ¥åæ¾æ°æ®ï¼èéèéç´¢å¼å¨ç´¢å¼é¡µéåæ¾çæ¯ç´¢å¼ï¼è¿äºç´¢å¼æåä¸é¨çæ°æ®é¡µçæ°æ®ã
## 13. æ°æ®åºä¸çå页æ¥è¯¢è¯å¥æä¹åï¼å¦ä½ä¼å
- Mysql ç limit ç¨æ³
- SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
- LIMIT æ¥åä¸ä¸ªæä¸¤ä¸ªæ°ååæ°ãåæ°å¿
é¡»æ¯ä¸ä¸ªæ´æ°å¸¸éã妿ç»å®ä¸¤ä¸ªåæ°ï¼ç¬¬ä¸ä¸ªåæ°æå®ç¬¬ä¸ä¸ªè¿åè®°å½è¡çåç§»éï¼ç¬¬äºä¸ªåæ°æå®è¿åè®°å½è¡çæå¤§æ°ç®ãåå§è®°å½è¡çåç§»éæ¯ 0(è䏿¯ 1)
- æåºæ¬çå页æ¹å¼ï¼SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ...
## 14. 常ç¨çæ°æ®åºæåªäºï¼Redisç¨è¿åï¼
- 常ç¨çæ°æ®åºæåªäºï¼Redisç¨è¿åï¼
- 常ç¨çæ°æ®åº
- MySQL
- SQLServer
- Redis
- Redis æ¯ä¸ä¸ªé度é常快çéå
³ç³»åæ°æ®åºï¼ä»å¯ä»¥åå¨é®(key)ä¸5ç§ä¸åç±»åçå¼ï¼valueï¼ä¹é´çæ å°ï¼å¯ä»¥å°åå¨å¨å
åä¸çé®å¼å¯¹æ°æ®æä¹
åå°ç¡¬çä¸ã
- ä¸ Memcached ç¸æ¯
- 两è
é½å¯ç¨äºåå¨é®å¼æ å°ï¼å½¼æ¤æ§è½ä¹ç¸å·®æ å
- Redis è½å¤èªå¨ä»¥ä¸¤ç§ä¸åçæ¹å¼å°æ°æ®åå
¥ç¡¬ç
- Redis é¤äºè½å卿®éçå符串é®ä¹å¤ï¼è¿å¯ä»¥åå¨å
¶ä»4ç§æ°æ®ç»æï¼memcached åªè½åå¨å符串é®
- Redis æ¢è½ç¨ä½ä¸»æ°æ®åºï¼ç±å¯ä»¥ä½ä¸ºå
¶ä»åå¨ç³»ç»çè¾
婿°æ®åº
- Redisåºç¨åºæ¯
- ç¼åãä»»å¡éåãåºç¨æè¡æ¦ãç½ç«è®¿é®ç»è®¡ãæ°æ®è¿æå¤çãåå¸å¼éç¾¤æ¶æä¸çsessionå离
- Redisç¹ç¹
- é«å¹¶å读å
- æµ·éæ°æ®ç髿åå¨å访é®
- é«å¯æ©å±æ§åé«å¯ç¨æ§
## 15. Redisçæ°æ®ç»æ
- STRINGï¼å¯ä»¥æ¯åç¬¦ä¸²ãæ´æ°æè
æµ®ç¹æ°
- LISTï¼ä¸ä¸ªé¾è¡¨ï¼é¾è¡¨ä¸çæ¯ä¸ªèç¹é½å
å«äºä¸ä¸ªå符串
- SETï¼å
å«åç¬¦ä¸²çæ åºæ¶éå¨ï¼unordered collectionï¼ï¼å¹¶ä¸è¢«å
å«çæ¯ä¸ªåç¬¦ä¸²é½æ¯ç¬ä¸æ äºãåä¸ç¸åç
- HASTï¼å
å«é®å¼å¯¹çæ åºæ£å表
- ZSETï¼å符串æåï¼memberï¼ä¸æµ®ç¹æ°åå¼ï¼scoreï¼ä¹é´çæåºæ å°ï¼å
ç´ çæå顺åºç±åå¼ç大å°å³å®
æ³¨ï¼æ´å¤ Redis ç¸å
³å
容å°å¨ [Redis](redis.md) ä¸è¿è¡å±å¼ï¼è¯·è½¬åã
## 16. ååºå表
ç®åæ¥è¯´ï¼æ°æ®çååå°±æ¯éè¿æç§ç¹å®çæ¡ä»¶ï¼å°æä»¬åæ¾å¨åä¸ä¸ªæ°æ®åºä¸çæ°æ®åæ£åæ¾å°å¤ä¸ªæ°æ®åºï¼ä¸»æºï¼ä¸ï¼ä»¥è¾¾å°åæ£åå°è®¾å¤è´è½½çææï¼å³ååºå表ã
æ°æ®çååæ ¹æ®å
¶ååè§åçç±»åï¼å¯ä»¥å为å¦ä¸ä¸¤ç§å忍¡å¼ã
- åç´ï¼çºµåï¼ååï¼æåä¸ç表æåæå¤ä¸ªè¡¨ï¼å¹¶åæ£å°ä¸åçæ°æ®åºï¼ä¸»æºï¼ä¸ã
- æ°´å¹³ï¼æ¨ªåï¼ååï¼æ ¹æ®è¡¨ä¸æ°æ®çé»è¾å
³ç³»ï¼å°åä¸ä¸ªè¡¨ä¸çæ°æ®æç
§æç§æ¡ä»¶æåå°å¤å°æ°æ®åºï¼ä¸»æºï¼ä¸ã
### 1. åç´åå
åç´å忝å°ä¸å¼ 表æåååæå¤ä¸ªè¡¨ï¼éå¸¸æ¯æç
§åçå
³ç³»å¯éç¨åº¦è¿è¡ååï¼ä¹å¯ä»¥å©ç¨åç´ååå°ç»å¸¸è¢«ä½¿ç¨çååä¸ç»å¸¸è¢«ä½¿ç¨çåååå°ä¸åç表ä¸ã
卿°æ®åºçå±é¢ä½¿ç¨åç´ååå°ææ°æ®åºä¸è¡¨çå¯éç¨åº¦é¨ç½²å°ä¸åçåºä¸ï¼ä¾å¦å°åæ¥ççµåæ°æ®åºåç´ååæååæ°æ®åº payDBãç¨æ·æ°æ®åº userBD çã
#### åç´ååçä¼ç¹
- æååä¸å¡æ¸
æ°ï¼æåè§åæç¡®
- ç³»ç»ä¹é´è¿è¡æ´åææ©å±å¾å®¹æ
- æç
§ææ¬ãåºç¨çç级ãåºç¨çç±»åçå°è¡¨æ¾å°ä¸åçæºå¨ä¸ï¼ä¾¿äºç®¡ç
- 便äºå®ç°**å¨éå离**ã**å·çå离**çæ°æ®åºè¡¨ç设计模å¼
- æ°æ®ç»´æ¤ç®å
#### åç´ååç缺ç¹
- é¨åä¸å¡è¡¨æ æ³å
³èï¼Joinï¼ï¼åªè½éè¿æ¥å£æ¹å¼è§£å³ï¼æé«äºç³»ç»çå¤æåº¦
- 忝ç§ä¸å¡çä¸åéå¶ï¼åå¨ååºæ§è½ç¶é¢ï¼ä¸æè¿è¡æ°æ®æ©å±åæåæ§è½
- äºå¡å¤ç夿
### 2. æ°´å¹³åå
æ°´å¹³ååå称为 Shardingï¼å®æ¯å°åä¸ä¸ªè¡¨ä¸çè®°å½æåå°å¤ä¸ªç»æç¸åç表ä¸ã
å½ä¸ä¸ªè¡¨çæ°æ®ä¸æå¢å¤æ¶ï¼Sharding æ¯å¿
ç¶çéæ©ï¼å®å¯ä»¥å°æ°æ®åå¸å°é群çä¸åèç¹ä¸ï¼ä»èç¼ååä¸ªæ°æ®åºçååã
#### æ°´å¹³ååçä¼ç¹
- ååºåè¡¨çæ°æ®ä¿æå¨ä¸å®çéçº§ï¼æå©äºæ§è½çæé«
- ååç表çç»æç¸åï¼åºç¨å±æ¹é è¾å°ï¼åªéè¦å¢å è·¯ç±è§åå³å¯
- æé«äºç³»ç»çç¨³å®æ§åè´è½½è½å
#### æ°´å¹³ååç缺ç¹
- åååï¼æ°æ®æ¯åæ£çï¼å¾é¾å©ç¨æ°æ®åºçJoinæä½ï¼è·¨åºJoinæ§è½è¾å·®
- æåè§åé¾ä»¥æ½è±¡
- åçäºå¡çä¸è´æ§é¾ä»¥è§£å³
- æ°æ®æ©å®¹çé¾åº¦åç»´æ¤éæå¤§
#### åç´åååæ°´å¹³ååçå
±åç¹
- åå¨åå¸å¼äºå¡çé®é¢
- åå¨è·¨èç¹Joinçé®é¢
- åå¨è·¨èç¹åå¹¶æåºãå页çé®é¢
- åå¨å¤æ°æ®æºç®¡ççé®é¢
### 3. Sharding çç¥
- åå¸å模ï¼hash(key) % NUM_DB
- æ¯å¦æç
§ userId mod 64.å°æ°æ®åå¸å¨64个æå¡å¨ä¸
- èå´ï¼å¯ä»¥æ¯ ID èå´ä¹å¯ä»¥æ¯æ¶é´èå´
- æ¯å¦æ¯å°æå¡å¨è®¡ååæ¾ä¸ä¸ªäº¿çæ°æ®,å
å°æ°æ®åå
¥æå¡å¨A.䏿¦æå¡å¨Aåæ»¡,åå°æ°æ®åå
¥æå¡å¨B,以æ¤ç±»æ¨. è¿ç§æ¹å¼ç好夿¯æ©å±æ¹ä¾¿.æ°æ®å¨å个æå¡å¨ä¸åå¸åå.
- æ å°è¡¨ï¼ä½¿ç¨åç¬çä¸ä¸ªæ°æ®åºæ¥å卿 å°å
³ç³»
### 4. Sharding åå¨çé®é¢åè§£å³æ¹æ¡
#### äºå¡é®é¢
使ç¨åå¸å¼äºå¡æ¥è§£å³ï¼æ¯å¦ XA æ¥å£ã
#### JOIN
å¯ä»¥å°åæ¥ç JOIN æ¥è¯¢åè§£æå¤ä¸ªå表æ¥è¯¢ï¼ç¶åå¨ç¨æ·ç¨åºä¸è¿è¡ JOINã
#### ID å¯ä¸æ§
- 使ç¨å
¨å±å¯ä¸ IDï¼GUIDã
- 为æ¯ä¸ªåçæå®ä¸ä¸ª ID èå´ã
- åå¸å¼ ID çæå¨ (å¦ Twitter ç Snowflake ç®æ³)ã
## 17. 主ä»å¤å¶ä¸è¯»åå离
### 主ä»å¤å¶
ä¸»è¦æ¶åä¸ä¸ªçº¿ç¨ï¼binlog 线ç¨ãI/O 线ç¨å SQL 线ç¨ã
- **binlog 线ç¨** ï¼è´è´£å°ä¸»æå¡å¨ä¸çæ°æ®æ´æ¹åå
¥äºè¿å¶æä»¶ï¼binlogï¼ä¸ã
- **I/O 线ç¨** ï¼è´è´£ä»ä¸»æå¡å¨ä¸è¯»åäºè¿å¶æ¥å¿æä»¶ï¼å¹¶åå
¥ä»æå¡å¨çä¸ç»§æ¥å¿ä¸ã
- **SQL 线ç¨** ï¼è´è´£è¯»åä¸ç»§æ¥å¿å¹¶éæ¾å
¶ä¸ç SQL è¯å¥ã
### 读åå离
主æå¡å¨ç¨æ¥å¤çåæä½ä»¥å宿¶æ§è¦æ±æ¯è¾é«ç读æä½ï¼è仿å¡å¨ç¨æ¥å¤ç读æä½ã
读åå离常ç¨ä»£çæ¹å¼æ¥å®ç°ï¼ä»£çæå¡å¨æ¥æ¶åºç¨å±ä¼ æ¥ç读å请æ±ï¼ç¶åå³å®è½¬åå°åªä¸ªæå¡å¨ã
MySQL 读ååç¦»è½æé«æ§è½çåå å¨äºï¼
- 䏻仿å¡å¨è´è´£åèªç读ååï¼æå¤§ç¨åº¦ç¼è§£äºéçäºç¨ï¼
- 仿å¡å¨å¯ä»¥é
ç½® MyISAM å¼æï¼æåæ¥è¯¢æ§è½ä»¥åè约系ç»å¼éï¼
- å¢å åä½ï¼æé«å¯ç¨æ§ã
## 18. æ¥è¯¢æ§è½ä¼å
### 1. ä½¿ç¨ Explain è¿è¡åæ
Explain ç¨æ¥åæ SELECT æ¥è¯¢è¯å¥ï¼å¼å人åå¯ä»¥éè¿åæ Explain ç»ææ¥ä¼åæ¥è¯¢è¯å¥ã
æ¯è¾éè¦çåæ®µæï¼
- **select_type** : æ¥è¯¢ç±»åï¼æç®åæ¥è¯¢ãèåæ¥è¯¢ãåæ¥è¯¢ç
- **key** : 使ç¨çç´¢å¼
- **rows** : æ«æçè¡æ°
```sql
mysql> explain select * from user_info where id = 2\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user_info
partitions: NULL
type: const
possible_keys: PRIMARY
key: PRIMARY
key_len: 8
ref: const
rows: 1
filtered: 100.00
Extra: NULL
1 row in set, 1 warning (0.00 sec)
```
æ´å¤å
容请åèï¼[MySQL æ§è½ä¼åç¥å¨ Explain 使ç¨åæ](https://segmentfault.com/a/1190000008131735)
### 2. ä¼åæ°æ®è®¿é®
#### 1. åå°è¯·æ±çæ°æ®é
ï¼ä¸ï¼åªè¿åå¿
è¦çå
æå¥½ä¸è¦ä½¿ç¨ SELECT * è¯å¥ã
ï¼äºï¼åªè¿åå¿
è¦çè¡
ä½¿ç¨ WHERE è¯å¥è¿è¡æ¥è¯¢è¿æ»¤ï¼ææ¶åä¹éè¦ä½¿ç¨ LIMIT è¯å¥æ¥éå¶è¿åçæ°æ®ã
ï¼ä¸ï¼ç¼åé夿¥è¯¢çæ°æ®
使ç¨ç¼åå¯ä»¥é¿å
卿°æ®åºä¸è¿è¡æ¥è¯¢ï¼ç¹å«è¦æ¥è¯¢çæ°æ®ç»å¸¸è¢«é夿¥è¯¢ï¼ç¼åå¯ä»¥å¸¦æ¥çæ¥è¯¢æ§è½æåå°ä¼æ¯éå¸¸ææ¾çã
#### 2. åå°æå¡å¨ç«¯æ«æçè¡æ°
æææçæ¹å¼æ¯ä½¿ç¨ç´¢å¼æ¥è¦çæ¥è¯¢ã
### 3. éææ¥è¯¢æ¹å¼
#### 1. åå大æ¥è¯¢
ä¸ä¸ªå¤§æ¥è¯¢å¦æä¸æ¬¡æ§æ§è¡çè¯ï¼å¯è½ä¸æ¬¡éä½å¾å¤æ°æ®ãå æ»¡æ´ä¸ªäºå¡æ¥å¿ãè尽系ç»èµæºãé»å¡å¾å¤å°çä½éè¦çæ¥è¯¢ã
```sql
DELEFT FROM messages WHERE create < DATE_SUB(NOW(), INTERVAL 3 MONTH);
```
```sql
rows_affected = 0
do {
rows_affected = do_query(
"DELETE FROM messages WHERE create < DATE_SUB(NOW(), INTERVAL 3 MONTH) LIMIT 10000")
} while rows_affected > 0
```
#### 2. åè§£å¤§è¿æ¥æ¥è¯¢
å°ä¸ä¸ªå¤§è¿æ¥æ¥è¯¢ï¼JOINï¼åè§£æå¯¹æ¯ä¸ä¸ªè¡¨è¿è¡ä¸æ¬¡å表æ¥è¯¢ï¼ç¶åå°ç»æå¨åºç¨ç¨åºä¸è¿è¡å
³èï¼è¿æ ·åç好夿ï¼
- 让ç¼åæ´é«æã对äºè¿æ¥æ¥è¯¢ï¼å¦æå
¶ä¸ä¸ä¸ªè¡¨åçååï¼é£ä¹æ´ä¸ªæ¥è¯¢ç¼åå°±æ æ³ä½¿ç¨ãèåè§£åçå¤ä¸ªæ¥è¯¢ï¼å³ä½¿å
¶ä¸ä¸ä¸ªè¡¨åçååï¼å¯¹å
¶å®è¡¨çæ¥è¯¢ç¼åä¾ç¶å¯ä»¥ä½¿ç¨ã
- åè§£æå¤ä¸ªå表æ¥è¯¢ï¼è¿äºå表æ¥è¯¢çç¼åç»ææ´å¯è½è¢«å
¶å®æ¥è¯¢ä½¿ç¨å°ï¼ä»èåå°åä½è®°å½çæ¥è¯¢ã
- åå°éç«äºï¼
- å¨åºç¨å±è¿è¡è¿æ¥ï¼å¯ä»¥æ´å®¹æå¯¹æ°æ®åºè¿è¡æåï¼ä»èæ´å®¹æåå°é«æ§è½å坿©å±ã
- æ¥è¯¢æ¬èº«æçä¹å¯è½ä¼æææåãä¾å¦ä¸é¢çä¾åä¸ï¼ä½¿ç¨ IN() 代æ¿è¿æ¥æ¥è¯¢ï¼å¯ä»¥è®© MySQL æç
§ ID 顺åºè¿è¡æ¥è¯¢ï¼è¿å¯è½æ¯éæºçè¿æ¥è¦æ´é«æã
```sql
SELECT * FROM tab
JOIN tag_post ON tag_post.tag_id=tag.id
JOIN post ON tag_post.post_id=post.id
WHERE tag.tag='mysql';
SELECT * FROM tag WHERE tag='mysql';
SELECT * FROM tag_post WHERE tag_id=1234;
SELECT * FROM post WHERE post.id IN (123,456,567,9098,8904);
```
## 19. éç±»å
MySQL/InnoDB çå éï¼ä¸ç´æ¯ä¸ä¸ªé¢è¯ä¸å¸¸é®çè¯é¢ãä¾å¦ï¼æ°æ®åºå¦ææé«å¹¶å请æ±ï¼å¦ä½ä¿è¯æ°æ®å®æ´æ§ï¼äº§çæ»éé®é¢å¦ä½ææ¥å¹¶è§£å³ï¼å¨å·¥ä½è¿ç¨ä¸ï¼ä¹ä¼ç»å¸¸ç¨å°ï¼ä¹è§éï¼æå®éçã
注ï¼MySQL æ¯ä¸ä¸ªæ¯ææä»¶å¼åå¨å¼æçæ°æ®åºç³»ç»ãä¸é¢çææä»ç»ï¼é½æ¯åºäº InnoDB åå¨å¼æï¼å
¶ä»å¼æç表ç°ï¼ä¼æè¾å¤§çåºå«ã
**çæ¬æ¥ç**
```mysql
select version();
```
**åå¨å¼ææ¥ç**
MySQL ç»å¼åè
æä¾äºæ¥è¯¢åå¨å¼æçåè½ï¼æè¿é使ç¨çæ¯ MySQL5.6.4ï¼å¯ä»¥ä½¿ç¨ï¼
```mysql
SHOW ENGINES
```
### 1. ä¹è§é
ç¨æ°æ®çæ¬ï¼Versionï¼è®°å½æºå¶å®ç°ï¼è¿æ¯ä¹è§éæå¸¸ç¨çä¸ç§å®ç°æ¹å¼ãä½è°æ°æ®çæ¬ï¼å³ä¸ºæ°æ®å¢å ä¸ä¸ªçæ¬æ è¯ï¼ä¸è¬æ¯éè¿ä¸ºæ°æ®åºè¡¨å¢å ä¸ä¸ªæ°åç±»åç âversionâ åæ®µæ¥å®ç°ãå½è¯»åæ°æ®æ¶ï¼å°versionåæ®µçå¼ä¸å读åºï¼æ°æ®æ¯æ´æ°ä¸æ¬¡ï¼å¯¹æ¤versionå¼å 1ã彿们æäº¤æ´æ°çæ¶åï¼å¤ææ°æ®åºè¡¨å¯¹åºè®°å½çå½åçæ¬ä¿¡æ¯ä¸ç¬¬ä¸æ¬¡ååºæ¥çversionå¼è¿è¡æ¯å¯¹ï¼å¦ææ°æ®åºè¡¨å½åçæ¬å·ä¸ç¬¬ä¸æ¬¡ååºæ¥çversionå¼ç¸çï¼åäºä»¥æ´æ°ï¼å¦å认为æ¯è¿ææ°æ®ã
**举ä¾**
1ãæ°æ®åºè¡¨è®¾è®¡
ä¸ä¸ªå段ï¼å嫿¯ id,value,version
```mysql
select id,value,version from TABLE where id=#{id}
```
2ãæ¯æ¬¡æ´æ°è¡¨ä¸çvalueåæ®µæ¶ï¼ä¸ºäºé²æ¢åçå²çªï¼éè¦è¿æ ·æä½
```mysql
update TABLE
set value=2,version=version+1
where id=#{id} and version=#{version};
```
### 2. æ²è§é
ä¸ä¹è§éç¸å¯¹åºçå°±æ¯æ²è§éäºãæ²è§éå°±æ¯å¨æä½æ°æ®æ¶ï¼è®¤ä¸ºæ¤æä½ä¼åºç°æ°æ®å²çªï¼æä»¥å¨è¿è¡æ¯æ¬¡æä½æ¶é½è¦éè¿è·åéæè½è¿è¡å¯¹ç¸åæ°æ®çæä½ï¼è¿ç¹è· Java ä¸ç synchronized å¾ç¸ä¼¼ï¼æä»¥æ²è§ééè¦èè´¹è¾å¤çæ¶é´ãå¦å¤ä¸ä¹è§éç¸å¯¹åºçï¼æ²è§éæ¯ç±æ°æ®åºèªå·±å®ç°äºçï¼è¦ç¨çæ¶åï¼æä»¬ç´æ¥è°ç¨æ°æ®åºçç¸å
³è¯å¥å°±å¯ä»¥äºã
说å°è¿éï¼ç±æ²è§éæ¶åå°çå¦å¤ä¸¤ä¸ªéæ¦å¿µå°±åºæ¥äºï¼å®ä»¬å°±æ¯**å
±äº«é**ä¸**æå®é**ã**å
±äº«éåæå®éæ¯æ²è§éçä¸åçå®ç°**ï¼å®ä¿©é½å±äºæ²è§éçèç´ã
以æå®é为ä¾ï¼
è¦ä½¿ç¨æ²è§éï¼æä»¬å¿
é¡»å
³é mysql æ°æ®åºçèªå¨æäº¤å±æ§ï¼å 为 MySQL é»è®¤ä½¿ç¨ autocommit 模å¼ï¼ä¹å°±æ¯è¯´ï¼å½ä½ æ§è¡ä¸ä¸ªæ´æ°æä½åï¼MySQL ä¼ç«å»å°ç»æè¿è¡æäº¤ã
æä»¬å¯ä»¥ä½¿ç¨å½ä»¤è®¾ç½® MySQL 为é autocommit 模å¼ï¼
```mysql
set autocommit=0;
# 设置å®autocommitåï¼æä»¬å°±å¯ä»¥æ§è¡æä»¬çæ£å¸¸ä¸å¡äºãå
·ä½å¦ä¸ï¼
# 1. å¼å§äºå¡ (ä¸è
éä¸å°±å¯ä»¥)
begin; / begin work; / start transaction;
# 2. æ¥è¯¢è¡¨ä¿¡æ¯
select status from TABLE where id=1 for update;
# 3. æå
¥ä¸æ¡æ°æ®
insert into TABLE (id,value) values (2,2);
# 4. ä¿®æ¹æ°æ®ä¸º
update TABLE set value=2 where id=1;
# 5. æäº¤äºå¡
commit;/commit work;
```
### 3. å
±äº«é
å
±äº«éåç§°**读é**ï¼read lockï¼ï¼æ¯è¯»åæä½å建çéãå
¶ä»ç¨æ·å¯ä»¥å¹¶åè¯»åæ°æ®ï¼ä½ä»»ä½äºå¡é½ä¸è½å¯¹æ°æ®è¿è¡ä¿®æ¹ï¼è·åæ°æ®ä¸çæä»éï¼ï¼ç´å°å·²éæ¾ææå
±äº«éã
妿äºå¡ T å¯¹æ°æ® A å ä¸å
±äº«éåï¼åå
¶ä»äºå¡åªè½å¯¹ A åå å
±äº«éï¼ä¸è½å æä»éãè·å¾å
±äº«éçäºå¡åªè½è¯»æ°æ®ï¼ä¸è½ä¿®æ¹æ°æ®
æå¼ç¬¬ä¸ä¸ªæ¥è¯¢çªå£
```mysql
#ä¸è
éä¸å°±å¯ä»¥
begin; / begin work; / start transaction;
SELECT * from TABLE where id = 1 lock in share mode;
```
ç¶åå¨å¦ä¸ä¸ªæ¥è¯¢çªå£ä¸ï¼å¯¹ id 为 1 çæ°æ®è¿è¡æ´æ°
```mysql
update TABLE set name="www.souyunku.com" where id =1;
```
æ¤æ¶ï¼æä½çé¢è¿å
¥äºå¡é¡¿ç¶æï¼è¿äºè¶
æ¶é´ï¼æç¤ºé误信æ¯
妿å¨è¶
æ¶åï¼æ§è¡ `commit`ï¼æ¤æ´æ°è¯å¥å°±ä¼æåã
```mysql
[SQL]update test_one set name="www.souyunku.com" where id =1;
[Err] 1205 - Lock wait timeout exceeded; try restarting transaction
```
å ä¸å
±äº«éåï¼ä¹æç¤ºé误信æ¯
```mysql
update test_one set name="www.souyunku.com" where id =1 lock in share mode;
[SQL]update test_one set name="www.souyunku.com" where id =1 lock in share mode;
[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'lock in share mode' at line 1
```
卿¥è¯¢è¯å¥åé¢å¢å `lock in share mode`ï¼MySQL ä¼å¯¹æ¥è¯¢ç»æä¸çæ¯è¡é½å å
±äº«éï¼å½æ²¡æå
¶ä»çº¿ç¨å¯¹æ¥è¯¢ç»æéä¸çä»»ä½ä¸è¡ä½¿ç¨æä»éæ¶ï¼å¯ä»¥æåç³è¯·å
±äº«éï¼å¦åä¼è¢«é»å¡ãå
¶ä»çº¿ç¨ä¹å¯ä»¥è¯»å使ç¨äºå
±äº«éç表ï¼èä¸è¿äºçº¿ç¨è¯»åçæ¯åä¸ä¸ªçæ¬çæ°æ®ã
å ä¸å
±äº«éåï¼å¯¹äº `update,insert,delete` è¯å¥ä¼èªå¨å æå®éã
### 4. æå®é
æä»é exclusive lockï¼ä¹å« writer lockï¼åç§°**åé**ã
**æå®éæ¯æ²è§éçä¸ç§å®ç°ï¼å¨ä¸é¢æ²è§éä¹ä»ç»è¿**ã
è¥äºå¡ 1 å¯¹æ°æ®å¯¹è±¡ A å ä¸ X éï¼äºå¡ 1 å¯ä»¥è¯» A ä¹å¯ä»¥ä¿®æ¹ Aï¼å
¶ä»äºå¡ä¸è½å对 A å ä»»ä½éï¼ç´å°äºç© 1 éæ¾ A ä¸çéãè¿ä¿è¯äºå
¶ä»äºå¡å¨äºç© 1 éæ¾ A ä¸çéä¹åä¸è½å读ååä¿®æ¹ Aãæå®éä¼é»å¡ææçæå®éåå
±äº«é
读å为ä»ä¹è¦å 读éå¢ï¼é²æ¢æ°æ®å¨è¢«è¯»åçæ¶å被å«ç线ç¨å ä¸åé
ä½¿ç¨æ¹å¼ï¼å¨éè¦æ§è¡çè¯å¥åé¢å ä¸ `for update` å°±å¯ä»¥äº
### 5. è¡é
è¡éåå**å
±äº«é**å**æä»é**,ç±å颿æçè§£ï¼å°±æ¯ç»æä¸è¡å ä¸éï¼ä¹å°±æ¯ä¸æ¡è®°å½å ä¸éã
**注æ**ï¼è¡çº§é齿¯åºäºç´¢å¼çï¼å¦æä¸æ¡SQLè¯å¥ç¨ä¸å°ç´¢å¼æ¯ä¸ä¼ä½¿ç¨è¡çº§éçï¼ä¼ä½¿ç¨è¡¨çº§éã
**å
±äº«éï¼**
åè¯è§£éï¼å
±äº«éåå«å读éï¼ææçäºå¡åªè½å¯¹å
¶è¿è¡è¯»æä½ä¸è½åæä½ï¼å ä¸å
±äº«éåå¨äºå¡ç»æä¹åå
¶ä»äºå¡åªè½åå å
±äº«éï¼é¤æ¤ä¹å¤å
¶ä»ä»»ä½ç±»åçéé½ä¸è½åå äºã
```mysql
#ç»æéçæ°æ®é½ä¼å å
±äº«é
SELECT * from TABLE where id = "1" lock in share mode;
```
**æä»éï¼**
åè¯è§£éï¼è¥æä¸ªäºç©å¯¹æä¸è¡å ä¸äºæä»éï¼åªè½è¿ä¸ªäºå¡å¯¹å
¶è¿è¡è¯»åï¼å¨æ¤äºå¡ç»æä¹åï¼å
¶ä»äºå¡ä¸è½å¯¹å
¶è¿è¡å ä»»ä½éï¼å
¶ä»è¿ç¨å¯ä»¥è¯»åï¼ä¸è½è¿è¡åæä½ï¼éçå¾
å
¶éæ¾ã
```mysql
select status from TABLE where id=1 for update;
```
å¯ä»¥åèä¹åæ¼ç¤ºçå
±äº«éï¼æå®éè¯å¥
ç±äºå¯¹äºè¡¨ä¸ id åæ®µä¸ºä¸»é®ï¼å°±ä¹ç¸å½äºç´¢å¼ãæ§è¡å éæ¶ï¼ä¼å° id è¿ä¸ªç´¢å¼ä¸º 1 çè®°å½å ä¸éï¼é£ä¹è¿ä¸ªéå°±æ¯è¡éã
### 6. 表é
å¦ä½å 表é
innodb çè¡éæ¯å¨æç´¢å¼çæ
åµä¸,没æç´¢å¼ç表æ¯éå®å
¨è¡¨ç.
**Innodbä¸çè¡éä¸è¡¨é**
å颿å°è¿ï¼å¨ Innodb 弿䏿¢æ¯æè¡é乿¯æè¡¨éï¼é£ä¹ä»ä¹æ¶åä¼é使´å¼ 表ï¼ä»ä¹æ¶åæåªéä½ä¸è¡å¢ï¼
åªæéè¿ç´¢å¼æ¡ä»¶æ£ç´¢æ°æ®ï¼InnoDB æä½¿ç¨è¡çº§éï¼å¦åï¼InnoDB å°ä½¿ç¨è¡¨éï¼
å¨å®é
åºç¨ä¸ï¼è¦ç¹å«æ³¨æ InnoDB è¡éçè¿ä¸ç¹æ§ï¼ä¸ç¶çè¯ï¼å¯è½å¯¼è´å¤§éçéå²çªï¼ä»èå½±åå¹¶åæ§è½ã
è¡çº§é齿¯åºäºç´¢å¼çï¼å¦æä¸æ¡ SQL è¯å¥ç¨ä¸å°ç´¢å¼æ¯ä¸ä¼ä½¿ç¨è¡çº§éçï¼ä¼ä½¿ç¨è¡¨çº§éãè¡çº§éçç¼ºç¹æ¯ï¼ç±äºéè¦è¯·æ±å¤§éçéèµæºï¼æä»¥é度æ
¢ï¼å
åæ¶è大ã
### 7. æ»é
æ»éï¼Deadlockï¼
æè°æ»éï¼æ¯æä¸¤ä¸ªæä¸¤ä¸ªä»¥ä¸çè¿ç¨å¨æ§è¡è¿ç¨ä¸ï¼å äºå¤ºèµæºèé æçä¸ç§äºç¸çå¾
çç°è±¡ï¼è¥æ å¤åä½ç¨ï¼å®ä»¬é½å°æ æ³æ¨è¿ä¸å»ãæ¤æ¶ç§°ç³»ç»å¤äºæ»éç¶ææç³»ç»äº§çäºæ»éï¼è¿äºæ°¸è¿å¨äºç¸çå¾
çè¿ç¨ç§°ä¸ºæ»éè¿ç¨ãç±äºèµæºå ç¨æ¯äºæ¥çï¼å½æä¸ªè¿ç¨æåºç³è¯·èµæºåï¼ä½¿å¾æå
³è¿ç¨å¨æ å¤ååå©ä¸ï¼æ°¸è¿åé
ä¸å°å¿
éçèµæºèæ æ³ç»§ç»è¿è¡ï¼è¿å°±äº§çäºä¸ç§ç¹æ®ç°è±¡æ»éã
è§£é¤æ£å¨æ»éçç¶ææä¸¤ç§æ¹æ³ï¼
**第ä¸ç§**ï¼
1. æ¥è¯¢æ¯å¦é表
```mysql
show OPEN TABLES where In_use > 0;
```
2. æ¥è¯¢è¿ç¨ï¼å¦ææ¨æSUPERæéï¼æ¨å¯ä»¥çå°ææçº¿ç¨ãå¦åï¼æ¨åªè½çå°æ¨èªå·±ç线ç¨ï¼
```mysql
show processlist
```
3. ææ»è¿ç¨idï¼å°±æ¯ä¸é¢å½ä»¤çidåï¼
```mysql
kill id
```
**第äºç§**ï¼
1. æ¥çå½åçäºå¡
```mysql
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
```
2. æ¥çå½åéå®çäºå¡
```mysql
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
```
3. æ¥çå½åçéçäºå¡
```mysql
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
```
**ææ»è¿ç¨**
```mysql
kill è¿ç¨ID
```
å¦æç³»ç»èµæºå
è¶³ï¼è¿ç¨çèµæºè¯·æ±é½è½å¤å¾å°æ»¡è¶³ï¼æ»éåºç°çå¯è½æ§å°±å¾ä½ï¼å¦åå°±ä¼å äºå¤ºæéçèµæºèé·å
¥æ»éãå
¶æ¬¡ï¼è¿ç¨è¿è¡æ¨è¿é¡ºåºä¸é度ä¸åï¼ä¹å¯è½äº§çæ»éã
äº§çæ»éçå个å¿
è¦æ¡ä»¶ï¼
1. äºæ¥æ¡ä»¶ï¼ä¸ä¸ªèµæºæ¯æ¬¡åªè½è¢«ä¸ä¸ªè¿ç¨ä½¿ç¨ã
2. 请æ±ä¸ä¿ææ¡ä»¶ï¼ä¸ä¸ªè¿ç¨å 请æ±èµæºèé»å¡æ¶ï¼å¯¹å·²è·å¾çèµæºä¿æä¸æ¾ã
3. ä¸å¥å¤ºæ¡ä»¶ï¼è¿ç¨å·²è·å¾çèµæºï¼å¨æ«ä½¿ç¨å®ä¹åï¼ä¸è½å¼ºè¡å¥å¤ºã
4. 循ç¯çå¾
æ¡ä»¶ï¼è¥å¹²è¿ç¨ä¹é´å½¢æä¸ç§å¤´å°¾ç¸æ¥ç循ç¯çå¾
èµæºå
³ç³»ã
è½ç¶ä¸è½å®å
¨é¿å
æ»éï¼ä½å¯ä»¥ä½¿æ»éçæ°éåè³æå°ãå°æ»éåè³æå°å¯ä»¥å¢å äºå¡çååéå¹¶åå°ç³»ç»å¼éï¼å ä¸ºåªæå¾å°çäºå¡åæ»ï¼èåæ»ä¼åæ¶äºå¡æ§è¡çææå·¥ä½ãç±äºæ»éæ¶åæ»èç±åºç¨ç¨åºéæ°æäº¤ã
**ä¸åæ¹æ³æå©äºæå¤§é度å°é使»éï¼**
1. æåä¸é¡ºåºè®¿é®å¯¹è±¡
2. é¿å
äºå¡ä¸çç¨æ·äº¤äº
3. ä¿æäºå¡ç®çå¹¶å¨ä¸ä¸ªæ¹å¤çä¸
4. 使ç¨ä½é离级å«
5. 使ç¨ç»å®è¿æ¥
说æï¼é´ééç¸å
³éç¥è¯å¾
è¡¥å
åèèµæï¼
- [Mysqléæºå¶ç®åäºè§£ä¸ä¸ - Javaé¢è¯éå
³æå - SegmentFault æå¦](https://segmentfault.com/a/1190000015219003#articleHeader0)
- [éæ¦å¿µççè§£ - æäºåº - SegmentFault æå¦](https://segmentfault.com/a/1190000015815061#articleHeader7)
# 第äºé¨åï¼é«æ§è½MySQLå®è·µ
## 1. å¦ä½è§£å³ç§æçæ§è½é®é¢åè¶
åç讨论
æ¢è®¢åç¯èä¸è¬ä¼å¸¦æ¥2个é®é¢ï¼
ãã1ãé«å¹¶å
ããæ¯è¾ç«ççç§æå¨çº¿äººæ°é½æ¯10wèµ·çï¼å¦æ¤ä¹é«çå¨çº¿äººæ°å¯¹äºç½ç«æ¶æä»åå°å齿¯ä¸ç§èéªã
ãã2ãè¶
å
ããä»»ä½ååé½ä¼ææ°éä¸éï¼å¦ä½é¿å
æåä¸è®¢åä¹°å°ååç人æ°ä¸è¶
è¿ååæ°éçä¸éï¼è¿æ¯æ¯ä¸ªæ¢è´æ´»å¨é½è¦é¢ä¸´çé¾é¢ã
### è§£å³æ¹æ¡1
ããå°ååºMySQLåç§»å°Redisä¸ï¼ææçåæä½æ¾å°å
åä¸ï¼ç±äºRedisä¸ä¸åå¨éæ
ä¸ä¼åºç°äºç¸çå¾
ï¼å¹¶ä¸ç±äºRedisçåæ§è½å读æ§è½é½è¿é«äºMySQLï¼è¿å°±è§£å³äºé«å¹¶åä¸çæ§è½é®é¢ãç¶åéè¿éåç弿¥ææ®µï¼å°ååçæ°æ®å¼æ¥åå
¥å°DBä¸ã
ããä¼ç¹ï¼è§£å³æ§è½é®é¢
ãã缺ç¹ï¼æ²¡æè§£å³è¶
åé®é¢ï¼åæ¶ç±äºå¼æ¥åå
¥DBï¼å卿䏿¶å»DBåRedis䏿°æ®ä¸ä¸è´çé£é©ã
### è§£å³æ¹æ¡2
ãã**å¼å
¥éåï¼ç¶åå°ææåDBæä½å¨åéå䏿éï¼å®å
¨ä¸²è¡å¤çãå½è¾¾å°åºåéå¼çæ¶åå°±ä¸å¨æ¶è´¹éåï¼å¹¶å
³éè´ä¹°åè½ãè¿å°±è§£å³äºè¶
åé®é¢ã**
ããä¼ç¹ï¼è§£å³è¶
åé®é¢ï¼ç¥å¾®æåæ§è½ã
ãã缺ç¹ï¼æ§è½åéäºéåå¤çæºå¤çæ§è½åDBçåå
¥æ§è½ä¸æççé£ä¸ªï¼å¦å¤å¤åååæ¶æ¢è´çæ¶åéè¦åå¤å¤æ¡éåã
### è§£å³æ¹æ¡3
ãã**å°æäº¤æä½åæä¸¤æ®µå¼ï¼å
ç³è¯·å确认ãç¶åå©ç¨Redisçååèªå¢æä½ï¼ç¸æ¯è¾MySQLçèªå¢æ¥è¯´æ²¡æç©ºæ´ï¼ï¼åæ¶å©ç¨Redisçäºå¡ç¹æ§æ¥åå·ï¼ä¿è¯æ¿å°å°äºçäºåºåéå¼çå·ç人é½å¯ä»¥æåæäº¤è®¢åã**ç¶åæ°æ®å¼æ¥æ´æ°å°DBä¸ã
ããä¼ç¹ï¼è§£å³è¶
åé®é¢ï¼åºå读åé½å¨å
åä¸ï¼æ
åæ¶è§£å³æ§è½é®é¢ã
ãã缺ç¹ï¼ç±äºå¼æ¥åå
¥DBï¼å¯è½å卿°æ®ä¸ä¸è´ãå¦å¯è½åå¨å°ä¹°ï¼ä¹å°±æ¯å¦ææ¿å°å·ç人ä¸çæ£ä¸è®¢åï¼å¯è½åºåå为0ï¼ä½æ¯è®¢åæ°å¹¶æ²¡æè¾¾å°åºåéå¼ã
åèèµæï¼
- [åºåæ£å¤äºï¼å°åºæä¹æ´ | æ¶æå¸ä¹è·¯](https://mp.weixin.qq.com/s/waGRvyhab2z8b-BIw9bJeA)
- [å¦ä½è§£å³ç§æçæ§è½é®é¢åè¶
åç讨论 - CSDNå客](https://blog.csdn.net/zhoudaxia/article/details/38067003)
## 2. æ°æ®åºä¸»ä»ä¸ä¸è´ï¼æä¹è§£
æ°æ®åºä¸»åºåä»åºä¸ä¸è´ï¼å¸¸è§æè¿ä¹å ç§ä¼åæ¹æ¡ï¼
ï¼1ï¼ä¸å¡å¯ä»¥æ¥åï¼ç³»ç»ä¸ä¼å
ï¼2ï¼å¼ºå¶è¯»ä¸»ï¼é«å¯ç¨ä¸»åºï¼ç¨ç¼åæé«è¯»æ§è½
ï¼3ï¼å¨cacheéè®°å½åªäºè®°å½åçè¿å请æ±ï¼æ¥è·¯ç±è¯»ä¸»è¿æ¯è¯»ä»
åèèµæï¼
- [æ°æ®åºä¸»ä»ä¸ä¸è´ï¼æä¹è§£ï¼](https://mp.weixin.qq.com/s/5JYtta9aMGcic7o_ejna-A)
# éå½ï¼åèèµæ
- [è§é¢ï¼MySQL äºå¡çé离级å«ä¸é-æå®¢å¦é¢](http://www.jikexueyuan.com/course/1524.html)
- [mysql-tutorial/3.5.md at master · jaywcjlove/mysql-tutorial](https://github.com/jaywcjlove/mysql-tutorial/blob/master/chapter3/3.5.md)
- [大ç¥å¸¦ä½ åæMysqlç´¢å¼åºå±æ°æ®ç»æ_åå©åå© (ã-ã)ã¤ã å¹²æ¯~-bilibili](https://www.bilibili.com/video/av17252271?from=search&seid=3701018912873961528)
- [大ä¼ç¹è¯è®¢åç³»ç»ååºå表å®è·µ](https://tech.meituan.com/dianping_order_db_sharding.html)
- [åºåæ£åè¿æè¿ä¹å¤æ¹æ¡ï¼ | æ¶æå¸ä¹è·¯](https://mp.weixin.qq.com/s/Lfy7ek-vArVBTaUYfl64Bg)
- [å
³äºååºå表ï¼è¿æä¸å¥å¤§èå
¨çè½»éçº§æ¶æè®¾è®¡æè·¯ï¼èèéæææ¯ä¸å®¶ï¼](https://www.toutiao.com/a6545626478447428103/?tt_from=weixin&article_category=stock×tamp=1524029012&app=news_article&iid=26214166927&wxshare_count=1)
- [Java大åäºèç½æ¶æ-å¿«éæå®å¤§åäºèç½ç½ç«ååºåè¡¨æ¹æ¡_åå©åå© (ã-ã)ã¤ã å¹²æ¯~-bilibili](https://www.bilibili.com/video/av20966672?from=search&seid=6900253656657206494)
- [MySQLååºå表_ITPUBå客](http://blog.itpub.net/29254281/viewspace-1819422/)
-