**ææé®é¢ä»¥åçæ¡ï¼æé½æ´çæäºé«æ¸ PDFï¼å¹¶ä¸å¸¦ç®å½ï¼[Javaé¢è¯æ´ç髿¸ PDFä¸è½½](https://gitee.com/tiger-a/java-interview/blob/master/interviewDoc/Java/index.md)** **ææé®é¢ä»¥åçæ¡ï¼æé½æ´çæäºé«æ¸ PDFï¼å¹¶ä¸å¸¦ç®å½ï¼[Javaé¢è¯æ´ç髿¸ PDFä¸è½½](https://gitee.com/tiger-a/java-interview/blob/master/interviewDoc/Java/index.md)** **ææé®é¢ä»¥åçæ¡ï¼æé½æ´çæäºé«æ¸ PDFï¼å¹¶ä¸å¸¦ç®å½ï¼[Javaé¢è¯æ´ç髿¸ PDFä¸è½½](https://gitee.com/tiger-a/java-interview/blob/master/interviewDoc/Java/index.md)** - [MySQLä¸çvarcharåcharæä»ä¹åºå«.](#mysqlä¸çvarcharåcharæä»ä¹åºå«) - [varchar(10)åint(10)代表ä»ä¹å«ä¹?](#varchar10åint10代表ä»ä¹å«ä¹) - [MySQLä¸varcharä¸charçåºå«ä»¥åvarchar(50)ä¸ç50ä»£è¡¨çæ¶µä¹](#mysqlä¸varcharä¸charçåºå«ä»¥åvarchar50ä¸ç50ä»£è¡¨çæ¶µä¹) - [请说ævarcharåtextçåºå«](#请说ævarcharåtextçåºå«) - [FLOATåDOUBLEçåºå«æ¯ä»ä¹ï¼](#floatådoubleçåºå«æ¯ä»ä¹) - [å¦ä½å¨MySQLç§è·åå½åæ¥æï¼](#å¦ä½å¨mysqlç§è·åå½åæ¥æ) - [MySQLä¸varcharä¸charçåºå«ä»¥åvarchar(50)ä¸ç50ä»£è¡¨çæ¶µä¹](#mysqlä¸varcharä¸charçåºå«ä»¥åvarchar50ä¸ç50ä»£è¡¨çæ¶µä¹) - [innodbçäºå¡ä¸æ¥å¿çå®ç°æ¹å¼](#innodbçäºå¡ä¸æ¥å¿çå®ç°æ¹å¼) - [MySQLçbinlogææå ç§å½å ¥æ ¼å¼?å嫿ä»ä¹åºå«?](#mysqlçbinlogææå ç§å½å ¥æ ¼å¼å嫿ä»ä¹åºå«) - [MySQLæ°æ®åºcpué£åæä¹å¤çï¼](#mysqlæ°æ®åºcpué£åæä¹å¤ç) - [è¶ å¤§å页æä¹å¤ç?](#è¶ å¤§å页æä¹å¤ç) - [å ³å¿è¿ä¸å¡ç³»ç»éé¢çsqlèæ¶å?ç»è®¡è¿æ ¢æ¥è¯¢å?å¯¹æ ¢æ¥è¯¢é½æä¹ä¼åè¿?](#å ³å¿è¿ä¸å¡ç³»ç»éé¢çsqlèæ¶åç»è®¡è¿æ ¢æ¥è¯¢åå¯¹æ ¢æ¥è¯¢é½æä¹ä¼åè¿) - [横åå表å纵åå表,å¯ä»¥åå«ä¸¾ä¸ä¸ªéåä»ä»¬çä¾åå?](#横åå表å纵åå表å¯ä»¥åå«ä¸¾ä¸ä¸ªéåä»ä»¬çä¾åå) - [ä»ä¹æ¯åå¨è¿ç¨ï¼æåªäºä¼ç¼ºç¹ï¼](#ä»ä¹æ¯åå¨è¿ç¨æåªäºä¼ç¼ºç¹) - [说ä¸è¯´ä¸ä¸ªèå¼](#说ä¸è¯´ä¸ä¸ªèå¼) - [MySQLçå¤å¶åç以念ç¨](#mysqlçå¤å¶åç以念ç¨) - [å ç§å ³èæ¥è¯¢](#å ç§å ³èæ¥è¯¢) - [å è¿æ¥å为ä¸ç±»](#å è¿æ¥å为ä¸ç±») - [å¤è¿æ¥ï¼LEFT JOIN/RIGHT JOINï¼](#å¤è¿æ¥left-joinright-join) - [èåæ¥è¯¢ï¼UNIONä¸UNION ALLï¼](#èåæ¥è¯¢unionä¸union-all) - [å ¨è¿æ¥ï¼FULL JOINï¼](#å ¨è¿æ¥full-join) - [UNIONä¸UNION ALLçåºå«ï¼](#unionä¸union-allçåºå«) - [SQLè¯å¥ä¼åçä¸äºæ¹æ³ï¼](#sqlè¯å¥ä¼åçä¸äºæ¹æ³) - [MySQLç±åªäºé¨åç»æ, åå«ç¨æ¥åä»ä¹](#mysqlç±åªäºé¨åç»æ-åå«ç¨æ¥åä»ä¹) - [妿ä¸ä¸ªè¡¨æä¸åå®ä¹ä¸ºTIMESTAMPï¼å°åçä»ä¹ï¼](#妿ä¸ä¸ªè¡¨æä¸åå®ä¹ä¸ºtimestampå°åçä»ä¹) - [MySQL éè®°å½è´§å¸ç¨ä»ä¹å段类å好](#mysql-éè®°å½è´§å¸ç¨ä»ä¹å段类å好) - [ä½ ä»¬æ°æ®åºæ¯å¦æ¯æemoji表æ ï¼å¦æä¸æ¯æï¼å¦ä½æä½ï¼](#ä½ ä»¬æ°æ®åºæ¯å¦æ¯æemoji表æ 妿䏿¯æå¦ä½æä½) - [MySQL æ°æ®åºä½åå¸ç³»ç»çåå¨ï¼ä¸å¤©äºä¸æ¡ä»¥ä¸çå¢éï¼ é¢è®¡è¿ç»´ä¸å¹´,æä¹ä¼åï¼](#mysql-æ°æ®åºä½åå¸ç³»ç»çåå¨ä¸å¤©äºä¸æ¡ä»¥ä¸çå¢é-é¢è®¡è¿ç»´ä¸å¹´æä¹ä¼å) - [ä¸ä¸ª6亿ç表aï¼ä¸ä¸ª3亿ç表bï¼éè¿å¤é´tidå ³èï¼ä½ å¦ä½æå¿«çæ¥è¯¢åºæ»¡è¶³æ¡ä»¶ç第50000å°ç¬¬50200ä¸çè¿200æ¡æ°æ®è®°å½ã](#ä¸ä¸ª6亿ç表aä¸ä¸ª3亿ç表béè¿å¤é´tidå ³èä½ å¦ä½æå¿«çæ¥è¯¢åºæ»¡è¶³æ¡ä»¶ç第50000å°ç¬¬50200ä¸çè¿200æ¡æ°æ®è®°å½) - [ä¼åæ°æ®åºçæ¹æ³](#ä¼åæ°æ®åºçæ¹æ³) - [ç®åæè¿° MySQL ä¸ï¼ç´¢å¼ï¼ä¸»é®ï¼å¯ä¸ç´¢å¼ï¼èåç´¢å¼çåºå«ï¼å¯¹æ°æ®åºçæ§è½æä»ä¹å½±åï¼ä»è¯»å两æ¹é¢ï¼](#ç®åæè¿°-mysql-ä¸ç´¢å¼ä¸»é®å¯ä¸ç´¢å¼èåç´¢å¼çåºå«å¯¹æ°æ®åºçæ§è½æä»ä¹å½±åä»è¯»å两æ¹é¢) - [SQL æ³¨å ¥æ¼æ´äº§ççåå ï¼å¦ä½é²æ¢ï¼](#sql-æ³¨å ¥æ¼æ´äº§ççåå å¦ä½é²æ¢) - [å卿¶æ](#å卿¶æ) - [è§£é MySQL å¤è¿æ¥ãå è¿æ¥ä¸èªè¿æ¥çåºå«](#è§£é-mysql-å¤è¿æ¥å è¿æ¥ä¸èªè¿æ¥çåºå«) - [åå¨å¼æå¸¸ç¨å½ä»¤](#åå¨å¼æå¸¸ç¨å½ä»¤) - [MySQLæ¯æåªäºåå¨å¼æ?](#mysqlæ¯æåªäºåå¨å¼æ) - [请说æInnoDBåMyISAMçåºå«](#请说æinnodbåmyisamçåºå«) - [innodb弿çç¹æ§](#innodb弿çç¹æ§) - [ä»ä¹æ¯è§¦åå¨ï¼MySQLä¸é½æåªäºè§¦åå¨ï¼](#ä»ä¹æ¯è§¦åå¨mysqlä¸é½æåªäºè§¦åå¨) - [InnoDBåMyISAMæä»ä¹åºå«?](#innodbåmyisamæä»ä¹åºå«) - [myisamchk æ¯ç¨æ¥åä»ä¹çï¼](#myisamchk-æ¯ç¨æ¥åä»ä¹ç) - [为ä»ä¹è¦å°½é设å®ä¸ä¸ªä¸»é®?](#为ä»ä¹è¦å°½é设å®ä¸ä¸ªä¸»é®) - [主é®ä½¿ç¨èªå¢IDè¿æ¯UUID?](#主é®ä½¿ç¨èªå¢idè¿æ¯uuid) - [åæ®µä¸ºä»ä¹è¦æ±å®ä¹ä¸ºnot null?](#åæ®µä¸ºä»ä¹è¦æ±å®ä¹ä¸ºnot-null) - [妿è¦åå¨ç¨æ·çå¯ç æ£å,åºè¯¥ä½¿ç¨ä»ä¹å段è¿è¡åå¨?](#妿è¦åå¨ç¨æ·çå¯ç æ£ååºè¯¥ä½¿ç¨ä»ä¹å段è¿è¡åå¨) - [ç´¢å¼æ¯ä¸ªä»ä¹æ ·çæ°æ®ç»æå¢?](#ç´¢å¼æ¯ä¸ªä»ä¹æ ·çæ°æ®ç»æå¢) - [å¯ä¸ç´¢å¼æ¯æ®éç´¢å¼å¿«å, 为ä»ä¹](#å¯ä¸ç´¢å¼æ¯æ®éç´¢å¼å¿«å-为ä»ä¹) - [ç´¢å¼çä¼ç¼ºç¹](#ç´¢å¼çä¼ç¼ºç¹) - [åè¿åªäºMySQLç´¢å¼ç¸å ³ä¼å](#åè¿åªäºmysqlç´¢å¼ç¸å ³ä¼å) - [æä¹çå°ä¸ºè¡¨æ ¼å®ä¹çææç´¢å¼ï¼](#æä¹çå°ä¸ºè¡¨æ ¼å®ä¹çææç´¢å¼) - [ç´¢å¼çåºç¡](#ç´¢å¼çåºç¡) - [å建索å¼çè¯æ³](#å建索å¼çè¯æ³) - [ç´¢å¼å¯¹æ§è½çå½±åï¼](#ç´¢å¼å¯¹æ§è½çå½±å) - [ç´¢å¼çç±»å](#ç´¢å¼çç±»å) - [ç´¢å¼çåºå«](#ç´¢å¼çåºå«) - [MySQLç´¢å¼çå建åå](#mysqlç´¢å¼çå建åå) - [ç´¢å¼ç使ç¨åºæ¯](#ç´¢å¼ç使ç¨åºæ¯) - [ç´¢å¼åç±»](#ç´¢å¼åç±») - [MySQLç´¢å¼ç注æäºé¡¹](#mysqlç´¢å¼ç注æäºé¡¹) - [MySQLç´¢å¼çåç](#mysqlç´¢å¼çåç) - [è§£é¢æ¹æ³](#è§£é¢æ¹æ³) - [å建MySQLèåç´¢å¼åºè¯¥æ³¨æä»ä¹ï¼](#å建mysqlèåç´¢å¼åºè¯¥æ³¨æä»ä¹) - [åå¼ä¸ºNULLæ¶ï¼æ¥è¯¢æ¯å¦ä¼ç¨å°ç´¢å¼ï¼](#åå¼ä¸ºnullæ¶æ¥è¯¢æ¯å¦ä¼ç¨å°ç´¢å¼) - [以ä¸è¯å¥æ¯å¦ä¼åºç¨ç´¢å¼ï¼SELECT FROM users WHERE YEAR(adddate) < 2007;](#以ä¸è¯å¥æ¯å¦ä¼åºç¨ç´¢å¼select-from-users-where-yearadddate--2007) - [MyISAMç´¢å¼å®ç°ï¼](#myisamç´¢å¼å®ç°) - [MyISAMç´¢å¼ä¸InnoDBç´¢å¼çåºå«ï¼](#myisamç´¢å¼ä¸innodbç´¢å¼çåºå«) - [使ç¨ç´¢å¼æ¥è¯¢ä¸å®è½æé«æ¥è¯¢çæ§è½åï¼ä¸ºä»ä¹](#使ç¨ç´¢å¼æ¥è¯¢ä¸å®è½æé«æ¥è¯¢çæ§è½å为ä»ä¹) - [ä»ä¹æ åµä¸è®¾ç½®äºç´¢å¼ä½æ æ³ä½¿ç¨](#ä»ä¹æ åµä¸è®¾ç½®äºç´¢å¼ä½æ æ³ä½¿ç¨) - [è¶ é®ãåéé®ã主é®ãå¤é®å嫿¯ä»ä¹ï¼](#è¶ é®åéé®ä¸»é®å¤é®å嫿¯ä»ä¹) - [ç®å说ä¸è¯´dropãdeleteä¸truncateçåºå«](#ç®å说ä¸è¯´dropdeleteä¸truncateçåºå«) - [dropãdeleteä¸truncateåå«å¨ä»ä¹åºæ¯ä¹ä¸ä½¿ç¨ï¼](#dropdeleteä¸truncateåå«å¨ä»ä¹åºæ¯ä¹ä¸ä½¿ç¨) - [B-Tree å B+Tree](#b-tree-å-btree) - [为ä»ä¹ B+Tree æ¯ B-Tree æ´éåå®é åºç¨ä¸æä½ç³»ç»çæä»¶ç´¢å¼åæ°æ®åºç´¢å¼ï¼**](#为ä»ä¹-btree-æ¯-b-tree-æ´éåå®é åºç¨ä¸æä½ç³»ç»çæä»¶ç´¢å¼åæ°æ®åºç´¢å¼) - [ä»ä¹æ¯è§å¾ï¼ä»¥åè§å¾ç使ç¨åºæ¯æåªäºï¼](#ä»ä¹æ¯è§å¾ä»¥åè§å¾ç使ç¨åºæ¯æåªäº) - [Hashç´¢å¼åB+æ æææä»ä¹åºå«æè 说ä¼å£å¢?](#hashç´¢å¼åbæ æææä»ä¹åºå«æè 说ä¼å£å¢) - [为ä»ä¹ç¨ B+ æ åç´¢å¼èä¸ç¨åå¸è¡¨åç´¢å¼?](#为ä»ä¹ç¨-b-æ åç´¢å¼èä¸ç¨åå¸è¡¨åç´¢å¼) - [ç´¢å¼æ¯ä»ä¹ï¼æä»ä¹ä½ç¨ä»¥åä¼ç¼ºç¹ï¼](#ç´¢å¼æ¯ä»ä¹æä»ä¹ä½ç¨ä»¥åä¼ç¼ºç¹) - [ä¸é¢æå°äºB+æ 卿»¡è¶³èç°ç´¢å¼åè¦çç´¢å¼çæ¶åä¸éè¦å表æ¥è¯¢æ°æ®,ä»ä¹æ¯èç°ç´¢å¼?](#ä¸é¢æå°äºbæ 卿»¡è¶³èç°ç´¢å¼åè¦çç´¢å¼çæ¶åä¸éè¦å表æ¥è¯¢æ°æ®ä»ä¹æ¯èç°ç´¢å¼) - [éèç°ç´¢å¼ä¸å®ä¼å表æ¥è¯¢å?](#éèç°ç´¢å¼ä¸å®ä¼å表æ¥è¯¢å) - [å¨å»ºç«ç´¢å¼çæ¶å,齿åªäºéè¦èèçå ç´ å¢?](#å¨å»ºç«ç´¢å¼çæ¶å齿åªäºéè¦èèçå ç´ å¢) - [èåç´¢å¼æ¯ä»ä¹?为ä»ä¹éè¦æ³¨æèåç´¢å¼ä¸ç顺åº?](#èåç´¢å¼æ¯ä»ä¹ä¸ºä»ä¹éè¦æ³¨æèåç´¢å¼ä¸ç顺åº) - [å建çç´¢å¼ææ²¡æè¢«ä½¿ç¨å°?æè 说æä¹æå¯ä»¥ç¥éè¿æ¡è¯å¥è¿è¡å¾æ ¢çåå ?](#å建çç´¢å¼ææ²¡æè¢«ä½¿ç¨å°æè 说æä¹æå¯ä»¥ç¥éè¿æ¡è¯å¥è¿è¡å¾æ ¢çåå ) - [é£ä¹å¨åªäºæ åµä¸ä¼åçé对该åå建äºç´¢å¼ä½æ¯å¨æ¥è¯¢çæ¶å并没æä½¿ç¨å¢?](#é£ä¹å¨åªäºæ åµä¸ä¼åçé对该åå建äºç´¢å¼ä½æ¯å¨æ¥è¯¢çæ¶å并没æä½¿ç¨å¢) - [ä»ä¹æ¯äºå¡?](#ä»ä¹æ¯äºå¡) - [æ°æ®åºçä¹è§éåæ²è§éæ¯ä»ä¹ï¼](#æ°æ®åºçä¹è§éåæ²è§éæ¯ä»ä¹) - [ACIDæ¯ä»ä¹?å¯ä»¥è¯¦ç»è¯´ä¸ä¸å?](#acidæ¯ä»ä¹å¯ä»¥è¯¦ç»è¯´ä¸ä¸å) - [åæ¶æå¤ä¸ªäºå¡å¨è¿è¡ä¼æä¹æ ·å¢?](#åæ¶æå¤ä¸ªäºå¡å¨è¿è¡ä¼æä¹æ ·å¢) - [Myql ä¸çäºå¡åæ»æºå¶æ¦è¿°](#myql-ä¸çäºå¡åæ»æºå¶æ¦è¿°) - [å¹¶åäºå¡å¸¦æ¥åªäºé®é¢?](#å¹¶åäºå¡å¸¦æ¥åªäºé®é¢) - [æä¹è§£å³è¿äºé®é¢å¢?MySQLçäºå¡é离级å«äºè§£å?](#æä¹è§£å³è¿äºé®é¢å¢mysqlçäºå¡é离级å«äºè§£å) - [Innodb使ç¨çæ¯åªç§é离级å«å¢?](#innodb使ç¨çæ¯åªç§é离级å«å¢) - [MySQL 䏿åªå ç§éï¼](#mysql-䏿åªå ç§é) - [对MySQLçéäºè§£å?](#对mysqlçéäºè§£å) - [éæºå¶ä¸InnoDBéç®æ³](#éæºå¶ä¸innodbéç®æ³) - [MySQL齿åªäºéå¢?åä¸é¢é£æ ·åè¿è¡éå®å²ä¸æ¯æç¹é»ç¢å¹¶åæçäº?](#mysql齿åªäºéå¢åä¸é¢é£æ ·åè¿è¡éå®å²ä¸æ¯æç¹é»ç¢å¹¶åæçäº) - [éçä¼åçç¥](#éçä¼åçç¥) - [Explain æ§è½åæ](#explain-æ§è½åæ) - [å¦ä½ä¼åSQL](#å¦ä½ä¼åsql) ### MySQLä¸çvarcharåcharæä»ä¹åºå«. charæ¯ä¸ä¸ªå®é¿å段,åå¦ç³è¯·äº`char(10)`ç空é´,é£ä¹æ 论å®é åå¨å¤å°å 容.è¯¥åæ®µé½å ç¨10个å符,èvarcharæ¯åé¿ç,ä¹å°±æ¯è¯´ç³è¯·çåªæ¯æå¤§é¿åº¦,å ç¨ç空é´ä¸ºå®é å符é¿åº¦+1,æåä¸ä¸ªå符åå¨ä½¿ç¨äºå¤é¿ç空é´. 卿£ç´¢æç䏿¥è®²,char > varchar,å æ¤å¨ä½¿ç¨ä¸,å¦æç¡®å®æä¸ªåæ®µçå¼çé¿åº¦,å¯ä»¥ä½¿ç¨char,å¦ååºè¯¥å°½é使ç¨varchar.ä¾å¦åå¨ç¨æ·MD5å å¯åçå¯ç ,ååºè¯¥ä½¿ç¨char. ### varchar(10)åint(10)代表ä»ä¹å«ä¹? varcharç10代表äºç³è¯·ç空é´é¿åº¦,乿¯å¯ä»¥åå¨çæ°æ®çæå¤§é¿åº¦,èintç10åªæ¯ä»£è¡¨äºå±ç¤ºçé¿åº¦,ä¸è¶³10ä½ä»¥0å¡«å .ä¹å°±æ¯è¯´,int(1)åint(10)æè½åå¨çæ°å大å°ä»¥åå ç¨ç空é´é½æ¯ç¸åç,åªæ¯å¨å±ç¤ºæ¶æç §é¿åº¦å±ç¤º. ### MySQLä¸varcharä¸charçåºå«ä»¥åvarchar(50)ä¸ç50ä»£è¡¨çæ¶µä¹ **(1)ãvarcharä¸charçåºå«** charæ¯ä¸ç§åºå®é¿åº¦çç±»åï¼varchar忝ä¸ç§å¯åé¿åº¦çç±»å **(2)ãvarchar(50)ä¸50çæ¶µä¹** æå¤åæ¾50个å符ï¼varchar(50)å(200)åå¨helloæå 空é´ä¸æ ·ï¼ä½åè å¨æåºæ¶ä¼æ¶èæ´å¤å åï¼å 为order by coléç¨fixed_length计ç®colé¿åº¦(memory弿ä¹ä¸æ ·) **(3)ãintï¼20ï¼ä¸20çæ¶µä¹** æ¯ææ¾ç¤ºå符çé¿åº¦ ä½è¦å åæ°çï¼æå¤§ä¸º255ï¼æ¯å¦å®æ¯è®°å½è¡æ°çid,æå ¥10ç¬èµæï¼å®å°±æ¾ç¤º00000000001 ~~~00000000010ï¼å½å符ç使°è¶ è¿11,å®ä¹åªæ¾ç¤º11ä½ï¼å¦æä½ 没æå é£ä¸ªè®©å®æªæ»¡11ä½å°±åé¢å 0çåæ°ï¼å®ä¸ä¼å¨åé¢å 0 20表示æå¤§æ¾ç¤ºå®½åº¦ä¸º20ï¼ä½ä»å 4åèåå¨ï¼åå¨èå´ä¸åï¼ **(4)ãmysql为ä»ä¹è¿ä¹è®¾è®¡** 坹大夿°åºç¨æ²¡ææä¹ï¼åªæ¯è§å®ä¸äºå·¥å ·ç¨æ¥æ¾ç¤ºå符ç个æ°ï¼int(1)åint(20)åå¨å计ç®å䏿 ·ï¼ ### 请说ævarcharåtextçåºå« - varchar坿å®å符æ°ï¼textä¸è½æå®ï¼å é¨åå¨varcharæ¯åå ¥çå®é å符æ°+1个åèï¼n<=255ï¼æ2个åè(n>255)ï¼textæ¯å®é å符æ°+2个åèã - textç±»åä¸è½æé»è®¤å¼ã - varcharå¯ç´æ¥å建索å¼ï¼textå建索å¼è¦æå®åå¤å°ä¸ªå符ãvarcharæ¥è¯¢é度快äºtext,å¨é½å建索å¼çæ åµä¸ï¼textçç´¢å¼å ä¹ä¸èµ·ä½ç¨ã - æ¥è¯¢textéè¦å建临æ¶è¡¨ã ### FLOATåDOUBLEçåºå«æ¯ä»ä¹ï¼ - FLOATç±»åæ°æ®å¯ä»¥åå¨è³å¤8ä½åè¿å¶æ°ï¼å¹¶å¨å åä¸å 4åèã - DOUBLEç±»åæ°æ®å¯ä»¥åå¨è³å¤18ä½åè¿å¶æ°ï¼å¹¶å¨å åä¸å 8åèã ### å¦ä½å¨MySQLç§è·åå½åæ¥æï¼ ``` SELECT CURRENT_DATE(); ``` ### MySQLä¸varcharä¸charçåºå«ä»¥åvarchar(50)ä¸ç50ä»£è¡¨çæ¶µä¹ **1ã** varcharä¸charçåºå«charæ¯ä¸ç§åºå®é¿åº¦çç±»åï¼varchar忝ä¸ç§å¯åé¿åº¦çç±»å **2ã** varchar(50)ä¸50çæ¶µä¹æå¤åæ¾50个å符ï¼varchar(50)å(200)åå¨helloæå 空é´ä¸æ ·ï¼ä½åè å¨æåºæ¶ä¼æ¶èæ´å¤å åï¼å 为order by coléç¨fixed_length计ç®colé¿åº¦(memory弿ä¹ä¸æ ·) **3ã** intï¼20ï¼ä¸20çæ¶µä¹æ¯ææ¾ç¤ºå符çé¿åº¦ä½è¦å åæ°çï¼æå¤§ä¸º255ï¼æ¯å¦å®æ¯è®°å½è¡æ°çid,æå ¥10ç¬èµæï¼å®å°±æ¾ç¤º00000000001 ~~~00000000010ï¼å½å符ç使°è¶ è¿11,å®ä¹åªæ¾ç¤º11ä½ï¼å¦æä½ 没æå é£ä¸ªè®©å®æªæ»¡11ä½å°±åé¢å 0çåæ°ï¼å®ä¸ä¼å¨åé¢å 020表示æå¤§æ¾ç¤ºå®½åº¦ä¸º20ï¼ä½ä»å 4åèåå¨ï¼åå¨èå´ä¸åï¼ **4ã** mysql为ä»ä¹è¿ä¹è®¾è®¡å¯¹å¤§å¤æ°åºç¨æ²¡ææä¹ï¼åªæ¯è§å®ä¸äºå·¥å ·ç¨æ¥æ¾ç¤ºå符ç个æ°ï¼int(1)åint(20)åå¨å计ç®å䏿 ·ï¼ ### innodbçäºå¡ä¸æ¥å¿çå®ç°æ¹å¼ **1ã** æå¤å°ç§æ¥å¿ï¼é误æ¥å¿ï¼è®°å½åºéä¿¡æ¯ï¼ä¹è®°å½ä¸äºè¦åä¿¡æ¯æè æ£ç¡®çä¿¡æ¯ãæ¥è¯¢æ¥å¿ï¼è®°å½ææå¯¹æ°æ®åºè¯·æ±çä¿¡æ¯ï¼ä¸è®ºè¿äºè¯·æ±æ¯å¦å¾å°äºæ£ç¡®çæ§è¡ãæ ¢æ¥è¯¢æ¥å¿ï¼è®¾ç½®ä¸ä¸ªéå¼ï¼å°è¿è¡æ¶é´è¶ è¿è¯¥å¼çææSQLè¯å¥é½è®°å½å°æ ¢æ¥è¯¢çæ¥å¿æä»¶ä¸ãäºè¿å¶æ¥å¿ï¼è®°å½å¯¹æ°æ®åºæ§è¡æ´æ¹çæææä½ãä¸ç»§æ¥å¿ï¼äºå¡æ¥å¿ï¼ **2ã** äºç©ç4ç§é离级å«é离级å«è¯»æªæäº¤(RU)读已æäº¤(RC)å¯éå¤è¯»(RR)ä¸²è¡ **3ã** äºå¡æ¯å¦ä½éè¿æ¥å¿æ¥å®ç°çï¼è¯´å¾è¶æ·±å ¥è¶å¥½ãäºå¡æ¥å¿æ¯éè¿redoåinnodbçåå¨å¼ææ¥å¿ç¼å²ï¼Innodb log bufferï¼æ¥å®ç°çï¼å½å¼å§ä¸ä¸ªäºå¡çæ¶åï¼ä¼è®°å½è¯¥äºå¡çlsn(log sequence number)å·; å½äºå¡æ§è¡æ¶ï¼ä¼å¾InnoDBåå¨å¼æçæ¥å¿çæ¥å¿ç¼åéé¢æå ¥äºå¡æ¥å¿ï¼å½äºå¡æäº¤æ¶ï¼å¿ é¡»å°åå¨å¼æçæ¥å¿ç¼å²åå ¥ç£çï¼éè¿innodb_flush_log_at_trx_commitæ¥æ§å¶ï¼ï¼ä¹å°±æ¯åæ°æ®åï¼éè¦å 忥å¿ãè¿ç§æ¹å¼ç§°ä¸ºâé¢åæ¥å¿æ¹å¼â ### MySQLçbinlogææå ç§å½å ¥æ ¼å¼?å嫿ä»ä¹åºå«? æä¸ç§æ ¼å¼,statement,rowåmixed. - statement模å¼ä¸,è®°å½åå 为è¯å¥.峿¯ä¸ä¸ªsqlé æçå½±åä¼è®°å½.ç±äºsqlçæ§è¡æ¯æä¸ä¸æç,å æ¤å¨ä¿åçæ¶åéè¦ä¿åç¸å ³çä¿¡æ¯,åæ¶è¿æä¸äºä½¿ç¨äºå½æ°ä¹ç±»çè¯å¥æ æ³è¢«è®°å½å¤å¶. - row级å«ä¸,è®°å½åå 为æ¯ä¸è¡çæ¹å¨,åºæ¬æ¯å¯ä»¥å ¨é¨è®°ä¸æ¥ä½æ¯ç±äºå¾å¤æä½,ä¼å¯¼è´å¤§éè¡çæ¹å¨(æ¯å¦alter table),å æ¤è¿ç§æ¨¡å¼çæä»¶ä¿åçä¿¡æ¯å¤ªå¤,æ¥å¿é太大. - mixed. ä¸ç§æä¸çæ¹æ¡,æ®éæä½ä½¿ç¨statementè®°å½,彿 æ³ä½¿ç¨statementçæ¶å使ç¨row. æ¤å¤,æ°ççMySQLä¸å¯¹row级å«ä¹åäºä¸äºä¼å,å½è¡¨ç»æåçååçæ¶å,ä¼è®°å½è¯å¥è䏿¯éè¡è®°å½. ### MySQLæ°æ®åºcpué£åå°500%çè¯ä»æä¹å¤çï¼ **1ã** ååºææè¿ç¨ show processlist,è§å¯ææè¿ç¨ ,å¤ç§æ²¡æç¶æååç(å¹²æ) **2ã** æ¥çè¶ æ¶æ¥å¿æè é误æ¥å¿ (åäºå å¹´å¼å,ä¸è¬ä¼æ¯æ¥è¯¢ä»¥å大æ¹éçæå ¥ä¼å¯¼è´cpuä¸i/o䏿¶¨,å½ç¶ä¸æé¤ç½ç»ç¶æçªç¶æäº,,导è´ä¸ä¸ªè¯·æ±æå¡å¨åªæ¥åå°ä¸åï¼æ¯å¦whereå奿å页å奿²¡æåé,,å½ç¶ç䏿¬¡è¢«åç»å) ### è¶ å¤§å页æä¹å¤ç? è¶ å¤§çå页ä¸è¬ä»ä¸¤ä¸ªæ¹å䏿¥è§£å³. - æ°æ®åºå±é¢,è¿ä¹æ¯æä»¬ä¸»è¦éä¸å ³æ³¨ç(è½ç¶æ¶ææ²¡é£ä¹å¤§),类似äº`select * from table where age > 20 limit 1000000,10`è¿ç§æ¥è¯¢å ¶å®ä¹æ¯æå¯ä»¥ä¼åçä½å°ç. è¿æ¡è¯å¥éè¦load1000000æ°æ®ç¶ååºæ¬ä¸å ¨é¨ä¸¢å¼,åªå10æ¡å½ç¶æ¯è¾æ ¢. 彿¶æä»¬å¯ä»¥ä¿®æ¹ä¸º`select * from table where id in (select id from table where age > 20 limit 1000000,10)`.è¿æ ·è½ç¶ä¹loadäºä¸ç¾ä¸çæ°æ®,使¯ç±äºç´¢å¼è¦ç,è¦æ¥è¯¢çææå段é½å¨ç´¢å¼ä¸,æä»¥é度ä¼å¾å¿«. 忶妿IDè¿ç»ç好,æä»¬è¿å¯ä»¥`select * from table where id > 1000000 limit 10`,æç乿¯ä¸éç,ä¼åçå¯è½æ§æè®¸å¤ç§,使¯æ ¸å¿ææ³é½ä¸æ ·,å°±æ¯åå°loadçæ°æ®. - ä»éæ±çè§åº¦åå°è¿ç§è¯·æ±â¦.ä¸»è¦æ¯ä¸å类似çéæ±(ç´æ¥è·³è½¬å°å ç¾ä¸é¡µä¹åçå ·ä½æä¸é¡µ.åªå 许é页æ¥çæè æç §ç»å®ç路线走,è¿æ ·å¯é¢æµ,å¯ç¼å)以å鲿¢IDæ³æ¼ä¸è¿ç»è¢«äººæ¶ææ»å». è§£å³è¶ 大å页,å ¶å®ä¸»è¦æ¯é ç¼å,å¯é¢æµæ§çæåæ¥å°å 容,ç¼åè³redisçk-Væ°æ®åºä¸,ç´æ¥è¿åå³å¯. å¨é¿éå·´å·´ãJavaå¼åæåãä¸,å¯¹è¶ å¤§å页çè§£å³åæ³æ¯ç±»ä¼¼äºä¸é¢æå°ç第ä¸ç§.  ### å ³å¿è¿ä¸å¡ç³»ç»éé¢çsqlèæ¶å?ç»è®¡è¿æ ¢æ¥è¯¢å?å¯¹æ ¢æ¥è¯¢é½æä¹ä¼åè¿? å¨ä¸å¡ç³»ç»ä¸,é¤äºä½¿ç¨ä¸»é®è¿è¡çæ¥è¯¢,å ¶ä»çæé½ä¼å¨æµè¯åºä¸æµè¯å ¶èæ¶,æ ¢æ¥è¯¢çç»è®¡ä¸»è¦ç±è¿ç»´å¨å,ä¼å®æå°ä¸å¡ä¸çæ ¢æ¥è¯¢åé¦ç»æä»¬. æ ¢æ¥è¯¢çä¼åé¦å è¦ææç½æ ¢çåå æ¯ä»ä¹? æ¯æ¥è¯¢æ¡ä»¶æ²¡æå½ä¸ç´¢å¼?æ¯loadäºä¸éè¦çæ°æ®å?è¿æ¯æ°æ®é太大? æä»¥ä¼å乿¯é对è¿ä¸ä¸ªæ¹åæ¥ç, - é¦å åæè¯å¥,ççæ¯å¦loadäºé¢å¤çæ°æ®,å¯è½æ¯æ¥è¯¢äºå¤ä½çè¡å¹¶ä¸æå¼æäº,å¯è½æ¯å è½½äºè®¸å¤ç»æä¸å¹¶ä¸éè¦çå,对è¯å¥è¿è¡åæä»¥åéå. - åæè¯å¥çæ§è¡è®¡å,ç¶åè·å¾å ¶ä½¿ç¨ç´¢å¼çæ åµ,ä¹åä¿®æ¹è¯å¥æè ä¿®æ¹ç´¢å¼,使å¾è¯å¥å¯ä»¥å°½å¯è½çå½ä¸ç´¢å¼. - 妿坹è¯å¥çä¼åå·²ç»æ æ³è¿è¡,å¯ä»¥èè表ä¸çæ°æ®éæ¯å¦å¤ªå¤§,妿æ¯çè¯å¯ä»¥è¿è¡æ¨ªåæè 纵åçå表. ### 横åå表å纵åå表,å¯ä»¥åå«ä¸¾ä¸ä¸ªéåä»ä»¬çä¾åå? **横ååè¡¨æ¯æè¡å表.** å设æä»¬æä¸å¼ ç¨æ·è¡¨,䏻鮿¯èªå¢IDä¸åæ¶æ¯ç¨æ·çID.æ°æ®éè¾å¤§,æ1äº¿å¤æ¡,é£ä¹æ¤æ¶æ¾å¨ä¸å¼ 表éçæ¥è¯¢ææå°±ä¸å¤ªçæ³.æä»¬å¯ä»¥æ ¹æ®ä¸»é®IDè¿è¡å表,æ è®ºæ¯æå°¾å·å,æè æIDçåºé´å齿¯å¯ä»¥ç. å设æç §å°¾å·0-99å为100个表,é£ä¹æ¯å¼ 表ä¸çæ°æ®å°±ä» æ100w.è¿æ¶çæ¥è¯¢æçæ çæ¯å¯ä»¥æ»¡è¶³è¦æ±ç. **纵ååè¡¨æ¯æåå表.** å设æä»¬ç°å¨æä¸å¼ æç« 表.å å«å段`id-æè¦-å 容`.èç³»ç»ä¸çå±ç¤ºå½¢å¼æ¯å·æ°åºä¸ä¸ªå表,å表ä¸ä» å 嫿 é¢åæè¦,å½ç¨æ·ç¹å»æç¯æç« è¿å ¥è¯¦æ æ¶æéè¦æ£æå 容.æ¤æ¶,å¦ææ°æ®é大,å°å 容è¿ä¸ªå¾å¤§ä¸ä¸ç»å¸¸ä½¿ç¨çåæ¾å¨ä¸èµ·ä¼ææ ¢åè¡¨çæ¥è¯¢é度.æä»¬å¯ä»¥å°ä¸é¢ç表åä¸ºä¸¤å¼ .`id-æè¦`,`id-å 容`.å½ç¨æ·ç¹å»è¯¦æ ,é£ä¸»é®åæ¥å䏿¬¡å 容å³å¯.èå¢å çåå¨éåªæ¯å¾å°ç主é®å段.代价å¾å°. å½ç¶,åè¡¨å ¶å®åä¸å¡çå ³è度å¾é«,å¨å表ä¹åä¸å®è¦å好è°ç 以åbenchmark.ä¸è¦æç §èªå·±ççæ³ç²ç®æä½. ### ä»ä¹æ¯åå¨è¿ç¨ï¼æåªäºä¼ç¼ºç¹ï¼ åå¨è¿ç¨æ¯ä¸äºé¢ç¼è¯çSQLè¯å¥ã **1ã** æ´å ç´ç½ççè§£ï¼åå¨è¿ç¨å¯ä»¥è¯´æ¯ä¸ä¸ªè®°å½éï¼å®æ¯ç±ä¸äºT-SQLè¯å¥ç»æç代ç åï¼è¿äºT-SQLè¯å¥ä»£ç åä¸ä¸ªæ¹æ³ä¸æ ·å®ç°ä¸äºåè½ï¼å¯¹å表æå¤è¡¨çå¢å æ¹æ¥ï¼ï¼ç¶ååç»è¿ä¸ªä»£ç ååä¸ä¸ªååï¼å¨ç¨å°è¿ä¸ªåè½çæ¶åè°ç¨ä»å°±è¡äºã **2ã** åå¨è¿ç¨æ¯ä¸ä¸ªé¢ç¼è¯ç代ç åï¼æ§è¡æçæ¯è¾é«,ä¸ä¸ªåå¨è¿ç¨æ¿ä»£å¤§éT_SQLè¯å¥ ï¼å¯ä»¥éä½ç½ç»éä¿¡éï¼æé«éä¿¡éç,å¯ä»¥ä¸å®ç¨åº¦ä¸ç¡®ä¿æ°æ®å®å ¨ 使¯,å¨äºèç½é¡¹ç®ä¸,å ¶å®æ¯ä¸å¤ªæ¨èåå¨è¿ç¨ç,æ¯è¾åºåçå°±æ¯é¿éçãJavaå¼åæåãä¸ç¦æ¢ä½¿ç¨åå¨è¿ç¨,æä¸ªäººççè§£æ¯,å¨äºèç½é¡¹ç®ä¸,è¿ä»£å¤ªå¿«,项ç®ççå½å¨æä¹æ¯è¾ç,äººåæµå¨ç¸æ¯äºä¼ ç»ç项ç®ä¹æ´å é¢ç¹,å¨è¿æ ·çæ åµä¸,åå¨è¿ç¨ç管çç¡®å®æ¯æ²¡æé£ä¹æ¹ä¾¿,åæ¶,å¤ç¨æ§ä¹æ²¡æå卿å¡å±é£ä¹å¥½. ### 说ä¸è¯´ä¸ä¸ªèå¼ **第ä¸èå¼ï¼1NFï¼ï¼** æ°æ®åºè¡¨ä¸çåæ®µé½æ¯åä¸å±æ§çï¼ä¸å¯ååãè¿ä¸ªåä¸å±æ§ç±åºæ¬ç±»åææï¼å æ¬æ´åã宿°ãå符åãé»è¾åãæ¥æåçã **第äºèå¼ï¼2NFï¼ï¼** æ°æ®åºè¡¨ä¸ä¸åå¨éå ³é®å段对任ä¸åéå ³é®å段çé¨å彿°ä¾èµï¼é¨å彿°ä¾èµæçæ¯åå¨ç»åå ³é®åä¸çæäºå段å³å®éå ³é®åæ®µçæ åµï¼ï¼ä¹å³ææéå ³é®å段é½å®å ¨ä¾èµäºä»»æä¸ç»åéå ³é®åã **第ä¸èå¼ï¼3NFï¼ï¼ ** å¨ç¬¬äºèå¼çåºç¡ä¸ï¼æ°æ®è¡¨ä¸å¦æä¸åå¨éå ³é®å段对任ä¸åéå ³é®å段çä¼ é彿°ä¾èµå符å第ä¸èå¼ãæè°ä¼ é彿°ä¾èµï¼æçæ¯å¦ æåå¨"A â B â C"çå³å®å ³ç³»ï¼åCä¼ é彿°ä¾èµäºAãå æ¤ï¼æ»¡è¶³ç¬¬ä¸èå¼çæ°æ®åºè¡¨åºè¯¥ä¸åå¨å¦ä¸ä¾èµå ³ç³»ï¼ å ³é®å段 â éå ³é®å段 x â éå ³é®å段y ### MySQLçå¤å¶åçä»¥åæµç¨ > åºæ¬åçæµç¨ï¼3个线ç¨ä»¥åä¹é´çå ³èï¼ **1ã主ï¼** binlog线ç¨ââè®°å½ä¸æææ¹åäºæ°æ®åºæ°æ®çè¯å¥ï¼æ¾è¿masterä¸çbinlogä¸ï¼ **2ãä»ï¼** io线ç¨ââå¨ä½¿ç¨start slave ä¹åï¼è´è´£ä»master䏿å binlog å å®¹ï¼æ¾è¿ èªå·±çrelay logä¸ï¼ **3ãä»ï¼** sqlæ§è¡çº¿ç¨ââæ§è¡relay logä¸çè¯å¥ï¼ ### å ç§å ³èæ¥è¯¢ - 交åè¿æ¥ï¼CROSS JOINï¼ - å è¿æ¥ï¼INNER JOINï¼ - å¤è¿æ¥ï¼LEFT JOIN/RIGHT JOINï¼ - èåæ¥è¯¢ï¼UNIONä¸UNION ALLï¼ - å ¨è¿æ¥ï¼FULL JOINï¼ - 交åè¿æ¥ï¼CROSS JOINï¼ ``` SELECT * FROM A,B(,C)æè SELECT * FROM A CROSS JOIN B (CROSS JOIN C)#没æä»»ä½å ³èæ¡ä»¶ï¼ç»ææ¯ç¬å¡å°ç§¯ï¼ç»æéä¼å¾å¤§ï¼æ²¡ææä¹ï¼å¾å°ä½¿ç¨å è¿æ¥ï¼INNER JOINï¼SELECT * FROM A,B WHERE A.id=B.idæè SELECT * FROM A INNER JOIN B ON A.id=B.idå¤è¡¨ä¸åæ¶ç¬¦åæç§æ¡ä»¶çæ°æ®è®°å½çéåï¼INNER JOINå¯ä»¥ç¼©å为JOIN ``` ### å è¿æ¥å为ä¸ç±» - çå¼è¿æ¥ï¼ON A.id=B.id - ä¸çå¼è¿æ¥ï¼ON A.id > B.id - èªè¿æ¥ï¼SELECT * FROM A T1 INNER JOIN A T2 ON T1.id=T2.pid ### å¤è¿æ¥ï¼LEFT JOIN/RIGHT JOINï¼ - å·¦å¤è¿æ¥ï¼LEFT OUTER JOIN, 以左表为主ï¼å æ¥è¯¢åºå·¦è¡¨ï¼æç §ONåçå ³èæ¡ä»¶å¹é å³è¡¨ï¼æ²¡æå¹é å°çç¨NULLå¡«å ï¼å¯ä»¥ç®åæLEFT JOIN - å³å¤è¿æ¥ï¼RIGHT OUTER JOIN, 以å³è¡¨ä¸ºä¸»ï¼å æ¥è¯¢åºå³è¡¨ï¼æç §ONåçå ³èæ¡ä»¶å¹é å·¦è¡¨ï¼æ²¡æå¹é å°çç¨NULLå¡«å ï¼å¯ä»¥ç®åæRIGHT JOIN ### èåæ¥è¯¢ï¼UNIONä¸UNION ALLï¼ ``` SELECT * FROM A UNION SELECT * FROM B UNION ... ``` - å°±æ¯æå¤ä¸ªç»æééä¸å¨ä¸èµ·ï¼UNIONåçç»æä¸ºåºåï¼éè¦æ³¨æçæ¯èåæ¥è¯¢çåæ°è¦ç¸çï¼ç¸åçè®°å½è¡ä¼åå¹¶ - å¦æä½¿ç¨UNION ALLï¼ä¸ä¼åå¹¶éå¤çè®°å½è¡ - æç UNION é«äº UNION ALL ### å ¨è¿æ¥ï¼FULL JOINï¼ - MySQL䏿¯æå ¨è¿æ¥ - å¯ä»¥ä½¿ç¨LEFT JOIN åUNIONåRIGHT JOINèåä½¿ç¨ ``` SELECT * FROM A LEFT JOIN B ON A.id=B.id UNIONSELECT * FROM A RIGHT JOIN B ON A.id=B.id ``` ### UNIONä¸UNION ALLçåºå«ï¼ - å¦æä½¿ç¨UNION ALLï¼ä¸ä¼åå¹¶éå¤çè®°å½è¡ - æç UNION é«äº UNION ALL ### SQLè¯å¥ä¼åçä¸äºæ¹æ³ï¼ - **1ã** 对æ¥è¯¢è¿è¡ä¼åï¼åºå°½éé¿å å ¨è¡¨æ«æï¼é¦å åºèèå¨ where å order by æ¶åçåä¸å»ºç«ç´¢å¼ã - **2ã** åºå°½éé¿å å¨ where åå¥ä¸å¯¹å段è¿è¡ null å¼å¤æï¼å¦åå°å¯¼è´å¼ææ¾å¼ä½¿ç¨ç´¢å¼èè¿è¡å ¨è¡¨æ«æï¼å¦ï¼ ``` select id from t where num is nullå¯ä»¥å¨numä¸è®¾ç½®é»è®¤å¼0ï¼ç¡®ä¿è¡¨ä¸numåæ²¡ænullå¼ï¼ç¶åè¿æ ·æ¥è¯¢ï¼select id from t where num= ``` - **3ã** åºå°½éé¿å å¨ where åå¥ä¸ä½¿ç¨!=æ<>æä½ç¬¦ï¼å¦å弿尿¾å¼ä½¿ç¨ç´¢å¼èè¿è¡å ¨è¡¨æ«æã - **4ã** åºå°½éé¿å å¨ where åå¥ä¸ä½¿ç¨or æ¥è¿æ¥æ¡ä»¶ï¼å¦åå°å¯¼è´å¼ææ¾å¼ä½¿ç¨ç´¢å¼èè¿è¡å ¨è¡¨æ«æï¼å¦ï¼ ``` select id from t where num=10 or num=20å¯ä»¥è¿æ ·æ¥è¯¢ï¼select id from t where num=10 union all select id from t where num=20 ``` - **5ã** in å not in ä¹è¦æ ç¨ï¼å¦åä¼å¯¼è´å ¨è¡¨æ«æï¼å¦ï¼ ``` select id from t where num in(1,2,3) 对äºè¿ç»çæ°å¼ï¼è½ç¨ between å°±ä¸è¦ç¨ in äºï¼select id from t where num between 1 and 3 ``` - **6ã** ä¸é¢çæ¥è¯¢ä¹å°å¯¼è´å ¨è¡¨æ«æï¼select id from t where name like â%æ%âè¥è¦æé«æçï¼å¯ä»¥èèå ¨ææ£ç´¢ã - **7ã** å¦æå¨ where åå¥ä¸ä½¿ç¨åæ°ï¼ä¹ä¼å¯¼è´å ¨è¡¨æ«æãå 为SQLåªæå¨è¿è¡æ¶æä¼è§£æå±é¨åéï¼ä½ä¼åç¨åºä¸è½å°è®¿é®è®¡åçéæ©æ¨è¿å°è¿è¡æ¶ï¼å®å¿ é¡»å¨ç¼è¯æ¶è¿è¡éæ©ãç¶ èï¼å¦æå¨ç¼è¯æ¶å»ºç«è®¿é®è®¡åï¼åéçå¼è¿æ¯æªç¥çï¼å èæ æ³ä½ä¸ºç´¢å¼éæ©çè¾å ¥é¡¹ãå¦ä¸é¢è¯å¥å°è¿è¡å ¨è¡¨æ«æï¼ ``` select id from t where num=@numå¯ä»¥æ¹ä¸ºå¼ºå¶æ¥è¯¢ä½¿ç¨ç´¢å¼ï¼select id from t with(index(ç´¢å¼å)) where num=@num ``` - **8ã** åºå°½éé¿å å¨ where åå¥ä¸å¯¹å段è¿è¡è¡¨è¾¾å¼æä½ï¼è¿å°å¯¼è´å¼ææ¾å¼ä½¿ç¨ç´¢å¼èè¿è¡å ¨è¡¨æ«æãå¦ï¼ ``` select id from t where num/2=100åºæ¹ä¸º:select id from t where num=100*2 ``` - **9ã** åºå°½éé¿å å¨whereåå¥ä¸å¯¹å段è¿è¡å½æ°æä½ï¼è¿å°å¯¼è´å¼ææ¾å¼ä½¿ç¨ç´¢å¼èè¿è¡å ¨è¡¨æ«æãå¦ï¼ ``` select id from t where substring(name,1,3)=âabcâ ï¼name以abcå¼å¤´çidåºæ¹ä¸º:select id from t where name like âabc%â ``` - **10ã** ä¸è¦å¨ where åå¥ä¸çâ=â左边è¿è¡å½æ°ãç®æ¯è¿ç®æå ¶ä»è¡¨è¾¾å¼è¿ç®ï¼å¦åç³»ç»å°å¯è½æ æ³æ£ç¡®ä½¿ç¨ç´¢å¼ã ### MySQLç±åªäºé¨åç»æ, åå«ç¨æ¥åä»ä¹ **1ãServer** - è¿æ¥å¨: 管çè¿æ¥, æééªè¯. - åæå¨: è¯æ³åæ, è¯æ³åæ. - ä¼åå¨: æ§è¡è®¡åçæ, ç´¢å¼çéæ©. - æ§è¡å¨: æä½åå¨å¼æ, è¿åæ§è¡ç»æ. **2ãåå¨å¼æ** : å卿°æ®, æä¾è¯»åæ¥å£. ### 妿ä¸ä¸ªè¡¨æä¸åå®ä¹ä¸ºTIMESTAMPï¼å°åçä»ä¹ï¼ æ¯å½è¡è¢«æ´æ¹æ¶ï¼ æ¶é´æ³å段å°è·åå½åæ¶é´æ³ãå设置为 AUTO INCREMENT æ¶ï¼ 妿å¨è¡¨ä¸è¾¾å°æå¤§å¼ï¼ ä¼åçä»ä¹æ åµï¼å®ä¼åæ¢éå¢ï¼ ä»»ä½è¿ä¸æ¥çæå ¥é½å°äº§çéè¯¯ï¼ å 为å¯é¥å·²è¢«ä½¿ç¨ã ææ ·æè½æ¾åºæå䏿¬¡æå ¥æ¶åé äºåªä¸ªèªå¨å¢éï¼LAST_INSERT_ID å°è¿åç± Auto_increment åé çæåä¸ä¸ªå¼ï¼ å¹¶ä¸ä¸éè¦æå®è¡¨åç§°ã ### MySQL éè®°å½è´§å¸ç¨ä»ä¹å段类å好 NUMERIC å DECIMAL ç±»å被 MySQL å®ç°ä¸ºåæ ·çç±»åï¼ è¿å¨ SQL92 æ åå 许ãä»ä»¬è¢«ç¨äºä¿åå¼ï¼ 该å¼çåç¡®ç²¾åº¦æ¯æå ¶éè¦çå¼ï¼ ä¾å¦ä¸éé±æå ³çæ°æ®ãå½å£°æä¸ä¸ªç±»æ¯è¿äºç±»åä¹ä¸æ¶ï¼ 精度åè§æ¨¡çè½è¢«(å¹¶ä¸é常æ¯)æå®ã ä¾å¦ï¼ ``` salary DECIMAL(9,2) ``` å¨è¿ä¸ªä¾åä¸ï¼ 9(precision)代表å°è¢«ç¨äºåå¨å¼çæ»çå°æ°ä½æ°ï¼è 2(scale)代表å°è¢«ç¨äºåå¨å°æ°ç¹åç使°ãå æ¤ï¼ å¨è¿ç§æ åµä¸ï¼ è½è¢«åå¨å¨ salary åä¸çå¼çèå´æ¯ä»-9999999.99 å°9999999.99ã ### ä½ ä»¬æ°æ®åºæ¯å¦æ¯æemoji表æ ï¼å¦æä¸æ¯æï¼å¦ä½æä½ï¼ 妿æ¯utf8å符éçè¯ï¼éè¦å级è³utf8_mb4æ¹å¯æ¯æ ### MySQL æ°æ®åºä½åå¸ç³»ç»çåå¨ï¼ä¸å¤©äºä¸æ¡ä»¥ä¸çå¢éï¼ é¢è®¡è¿ç»´ä¸å¹´,æä¹ä¼åï¼ **1ã** 设计è¯å¥½çæ°æ®åºç»æï¼ å 许é¨åæ°æ®åä½ï¼ å°½éé¿å join æ¥è¯¢ï¼ æé«æçã **2ã** éæ©åéçè¡¨åæ®µæ°æ®ç±»åååå¨å¼æï¼ éå½çæ·»å ç´¢å¼ã **3ã** MySQL åºä¸»ä»è¯»åå离ã **4ã** æ¾è§å¾åè¡¨ï¼ åå°å表ä¸çæ°æ®éæé«æ¥è¯¢é度ã5ãæ·»å ç¼åæºå¶ï¼ æ¯å¦ memcachedï¼ apc çã **5ã** ä¸ç»å¸¸æ¹å¨ç页é¢ï¼ çæéæé¡µé¢ã **6ã** 书å髿çç SQLãæ¯å¦ SELECT * FROM TABEL æ¹ä¸º SELECT field_1, field_2, field_3 FROM TABLE. ### ä¸ä¸ª6亿ç表aï¼ä¸ä¸ª3亿ç表bï¼éè¿å¤é´tidå ³èï¼ä½ å¦ä½æå¿«çæ¥è¯¢åºæ»¡è¶³æ¡ä»¶ç第50000å°ç¬¬50200ä¸çè¿200æ¡æ°æ®è®°å½ã **1ã妿A表TIDæ¯èªå¢é¿,并䏿¯è¿ç»ç,B表çID为索å¼** ```sql select * from a,b where a.tid = b.id and a.tid>500000 limit 200; ``` **2ã妿A表çTID䏿¯è¿ç»ç,é£ä¹å°±éè¦ä½¿ç¨è¦çç´¢å¼.TIDè¦ä¹æ¯ä¸»é®,è¦ä¹æ¯è¾ å©ç´¢å¼,B表IDä¹éè¦æç´¢å¼ã** ```sql select * from b , (select tid from a limit 50000,200) a where b.id = a .tid; ``` ### ä¼åæ°æ®åºçæ¹æ³ **1ã** éåæéç¨çåæ®µå±æ§ï¼å°½å¯è½åå°å®ä¹å段宽度ï¼å°½éæå段设置 NOTNULLï¼ ä¾å¦â ç份âãâ æ§å«â æå¥½éç¨ ENUM **2ã** 使ç¨è¿æ¥(JOIN)æ¥ä»£æ¿åæ¥è¯¢ **3ã** éç¨èå(UNION)æ¥ä»£æ¿æå¨å建ç临æ¶è¡¨ **4ã** äºå¡å¤ç **5ã** éå®è¡¨ãä¼åäºå¡å¤ç **6ã** éç¨å¤é®ï¼ ä¼åéå®è¡¨ **7ã** 建ç«ç´¢å¼ **8ã** ä¼åæ¥è¯¢è¯å¥ ### ç®åæè¿° MySQL ä¸ï¼ç´¢å¼ï¼ä¸»é®ï¼å¯ä¸ç´¢å¼ï¼èåç´¢å¼çåºå«ï¼å¯¹æ°æ®åºçæ§è½æä»ä¹å½±åï¼ä»è¯»å两æ¹é¢ï¼ ç´¢å¼æ¯ä¸ç§ç¹æ®çæä»¶(InnoDB æ°æ®è¡¨ä¸çç´¢å¼æ¯è¡¨ç©ºé´çä¸ä¸ªç»æé¨å)ï¼ å®ä»¬å å«çå¯¹æ°æ®è¡¨éææè®°å½çå¼ç¨æéã æ®éç´¢å¼(ç±å ³é®å KEY æ INDEX å®ä¹çç´¢å¼)çå¯ä¸ä»»å¡æ¯å å¿«å¯¹æ°æ®ç访é®éåº¦ã æ®éç´¢å¼å 许被索å¼çæ°æ®åå å«éå¤çå¼ã妿è½ç¡®å®æä¸ªæ°æ®åå°åªå å«å½¼æ¤åä¸ç¸åçå¼ï¼ å¨ä¸ºè¿ä¸ªæ°æ®åå建索å¼çæ¶åå°±åºè¯¥ç¨å ³é®å UNIQUE æå®å®ä¹ä¸ºä¸ä¸ªå¯ä¸ç´¢å¼ãä¹å°±æ¯è¯´ï¼ å¯ä¸ç´¢å¼å¯ä»¥ä¿è¯æ°æ®è®°å½çå¯ä¸æ§ã 主é®ï¼ æ¯ä¸ç§ç¹æ®çå¯ä¸ç´¢å¼ï¼ å¨ä¸å¼ 表ä¸åªè½å®ä¹ä¸ä¸ªä¸»é®ç´¢å¼ï¼ 主é®ç¨äºå¯ä¸æ è¯ä¸æ¡è®°å½ï¼ 使ç¨å ³é®å PRIMARY KEY æ¥å建ã ç´¢å¼å¯ä»¥è¦çå¤ä¸ªæ°æ®åï¼å¦å INDEX(columnA, columnB)ç´¢å¼ï¼è¿å°±æ¯èåç´¢å¼ã ç´¢å¼å¯ä»¥æå¤§çæé«æ°æ®çæ¥è¯¢éåº¦ï¼ ä½æ¯ä¼éä½æå ¥ãå é¤ãæ´æ°è¡¨çéåº¦ï¼ å ä¸ºå¨æ§è¡è¿äºåæä½æ¶ï¼ è¿è¦æä½ç´¢å¼æä»¶ã ### SQL æ³¨å ¥æ¼æ´äº§ççåå ï¼å¦ä½é²æ¢ï¼ **SQL æ³¨å ¥äº§ççåå ï¼** ç¨åºå¼åè¿ç¨ä¸ä¸æ³¨æè§è书å sql è¯å¥åå¯¹ç¹æ®å符è¿è¡è¿æ»¤ï¼å¯¼è´å®¢æ·ç«¯å¯ä»¥éè¿å ¨å±åé POST å GET æäº¤ä¸äº sql è¯å¥æ£å¸¸æ§è¡ã鲿¢ SQL æ³¨å ¥çæ¹å¼ï¼ å¼å¯é ç½®æä»¶ä¸ç magic_quotes_gpc å magic_quotes_runtime 设置 æ§è¡ sql è¯å¥æ¶ä½¿ç¨ addslashes è¿è¡ sql è¯å¥è½¬æ¢Sql è¯å¥ä¹¦åå°½éä¸è¦çç¥åå¼å·ååå¼å·ã è¿æ»¤æ sql è¯å¥ä¸çä¸äºå ³é®è¯ï¼ updateãinsertãdeleteãselectã * ã æé«æ°æ®åºè¡¨ååæ®µçå½åæå·§ï¼ 对ä¸äºéè¦çåæ®µæ ¹æ®ç¨åºçç¹ç¹å½åï¼ åä¸æè¢«çå°çã ### å卿¶æ **Datatimeï¼** 以 YYYY-MM-DD HH:MM:SS æ ¼å¼å卿¶ææ¶é´ï¼ 精确å°ç§ï¼ å ç¨ 8 个åèå¾åå¨ç©ºé´ï¼ datatime ç±»å䏿¶åºæ å ³ **Timestampï¼** 以æ¶é´æ³æ ¼å¼åå¨ï¼å ç¨ 4 个åèï¼èå´å° 1970-1-1 å° 2038-1-19ï¼ æ¾ç¤ºä¾èµäºææå®å¾æ¶åºï¼ é»è®¤å¨ç¬¬ä¸ä¸ªåè¡çæ°æ®ä¿®æ¹æ¶å¯ä»¥èªå¨å¾ä¿®æ¹timestamp åå¾å¼ **Dateï¼ çæ¥ï¼ï¼** å ç¨å¾åèæ°æ¯ä½¿ç¨å符串.datatime.int å¨åè¦å°ï¼ ä½¿ç¨ date åªéè¦ 3 个åèï¼ å卿¥ææä»½ï¼ è¿å¯ä»¥å©ç¨æ¥ææ¶é´å½æ°è¿è¡æ¥æé´å¾è®¡ç®Time:å卿¶é´é¨å徿°æ® **注æ:** ä¸è¦ä½¿ç¨åç¬¦ä¸²ç±»åæ¥å卿¥ææ¶é´æ°æ®ï¼ é常æ¯å符串å ç¨å¾å¨å空é´å°ï¼ å¨è¿è¡æ¥æ¾è¿æ»¤å¯ä»¥å©ç¨æ¥æå¾å½æ°ï¼ä½¿ç¨ int å卿¥ææ¶é´ä¸å¦ä½¿ç¨ timestamp ç±»å ### è§£é MySQL å¤è¿æ¥ãå è¿æ¥ä¸èªè¿æ¥çåºå« **å 说ä»ä¹æ¯äº¤åè¿æ¥:** 交åè¿æ¥åå«ç¬å¡å°ç§¯ï¼å®æ¯æä¸ä½¿ç¨ä»»ä½æ¡ä»¶ï¼ç´æ¥å°ä¸ä¸ªè¡¨çææè®°å½åå¦ä¸ä¸ªè¡¨ä¸çææè®°å½ä¸ä¸å¹é ã **å è¿æ¥** åæ¯åªææ¡ä»¶ç交åè¿æ¥ï¼æ ¹æ®æä¸ªæ¡ä»¶çéåºç¬¦åæ¡ä»¶çè®°å½ï¼ä¸ç¬¦åæ¡ä»¶çè®°å½ä¸ä¼åºç°å¨ç»æéä¸ï¼ å³å è¿æ¥åªè¿æ¥å¹é çè¡ã **å¤è¿æ¥** å ¶ç»æéä¸ä¸ä» å å«ç¬¦åè¿æ¥æ¡ä»¶çè¡ï¼èä¸è¿ä¼å æ¬å·¦è¡¨ãå³è¡¨æä¸¤ä¸ªè¡¨ä¸çæææ°æ®è¡ï¼ è¿ä¸ç§æ åµä¾æ¬¡ç§°ä¹ä¸ºå·¦å¤è¿æ¥ï¼ å³å¤è¿æ¥ï¼ åå ¨å¤è¿æ¥ãå·¦å¤è¿æ¥ï¼ ä¹ç§°å·¦è¿æ¥ï¼ å·¦è¡¨ä¸ºä¸»è¡¨ï¼ å·¦è¡¨ä¸çææè®°å½é½ä¼åºç°å¨ç»æéä¸ï¼ 对äºé£äºå¨å³è¡¨ä¸å¹¶æ²¡æå¹é çè®°å½ï¼ ä»ç¶è¦æ¾ç¤ºï¼ å³è¾¹å¯¹åºçé£äºå段å¼ä»¥NULL æ¥å¡«å ãå³å¤è¿æ¥ï¼ä¹ç§°å³è¿æ¥ï¼å³è¡¨ä¸ºä¸»è¡¨ï¼å³è¡¨ä¸çææè®°å½é½ä¼åºç°å¨ç»æéä¸ãå·¦è¿æ¥åå³è¿æ¥å¯ä»¥äºæ¢ï¼ MySQL ç®åè¿ä¸æ¯æå ¨å¤è¿æ¥ã ### åå¨å¼æå¸¸ç¨å½ä»¤ **æ¥ç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" ; ```  ### MySQLæ¯æåªäºåå¨å¼æ? MySQLæ¯æå¤ç§åå¨å¼æ,æ¯å¦InnoDB,MyISAM,Memory,Archiveçç.å¨å¤§å¤æ°çæ åµä¸,ç´æ¥éæ©ä½¿ç¨InnoDB弿齿¯æåéç,InnoDB乿¯MySQLçé»è®¤åå¨å¼æ. ### 请说æInnoDBåMyISAMçåºå« - InnoDBæ¯æäºå¡ï¼MyISAM䏿¯æï¼ - InnoDBæ°æ®åå¨å¨å ±äº«è¡¨ç©ºé´ï¼MyISAMæ°æ®åå¨å¨æä»¶ä¸ï¼ - InnoDBæ¯æè¡çº§éï¼MyISAMåªæ¯æè¡¨éï¼ - InnoDBæ¯æå´©æºåçæ¢å¤ï¼MyISAM䏿¯æï¼ - InnoDBæ¯æå¤é®ï¼MyISAM䏿¯æï¼ - InnoDB䏿¯æå ¨æç´¢å¼ï¼MyISAMæ¯æå ¨æç´¢å¼ï¼ ### innodb弿çç¹æ§ - æå ¥ç¼å²ï¼insert buffer) - äºæ¬¡å(double write) - èªéåºåå¸ç´¢å¼(ahi) - é¢è¯»(read ahead) ### ä»ä¹æ¯è§¦åå¨ï¼MySQLä¸é½æåªäºè§¦åå¨ï¼ 触å卿¯æä¸æ®µä»£ç ï¼å½è§¦åæä¸ªäºä»¶æ¶ï¼èªå¨æ§è¡è¿äºä»£ç ãå¨MySQLæ°æ®åºä¸æå¦ä¸å ç§è§¦åå¨ï¼ - 1ãBefore Insert - 2ãAfter Insert - 3ãBefore Update - 4ãAfter Update - 5ãBefore Delete - 6ãAfter Delete ### InnoDBåMyISAMæä»ä¹åºå«? - InnoDBæ¯æäºç©ï¼èMyISAM䏿¯æäºç© - InnoDBæ¯æè¡çº§éï¼èMyISAMæ¯æè¡¨çº§é - InnoDBæ¯æMVCC, èMyISAM䏿¯æ - InnoDBæ¯æå¤é®ï¼èMyISAM䏿¯æ - InnoDB䏿¯æå ¨æç´¢å¼ï¼èMyISAMæ¯æã | | MyISAM | Innodb | | ------------------------------------------------------------ | ------------------------------------------------- | ---------------------------------------- | | æä»¶æ ¼å¼ | æ°æ®åç´¢å¼æ¯åå«åå¨çï¼æ°æ®`.MYD`ï¼ç´¢å¼`.MYI` | æ°æ®åç´¢å¼æ¯éä¸åå¨çï¼`.ibd` | | æä»¶è½å¦ç§»å¨ | è½ï¼ä¸å¼ 表就对åº`.frm`ã`MYD`ã`MYI`3个æä»¶ | å¦ï¼å ä¸ºå ³èçè¿æ`data`ä¸çå ¶å®æä»¶ | | è®°å½åå¨é¡ºåº | æè®°å½æå ¥é¡ºåºä¿å | æä¸»é®å¤§å°æåºæå ¥ | | 空é´ç¢çï¼å é¤è®°å½å¹¶`flush table 表å`ä¹åï¼è¡¨æä»¶å¤§å°ä¸åï¼ | 产çã宿¶æ´çï¼ä½¿ç¨å½ä»¤`optimize table 表å`å®ç° | ä¸äº§ç | | äºå¡ | 䏿¯æ | æ¯æ | | å¤é® | 䏿¯æ | æ¯æ | | 鿝æï¼éæ¯é¿å èµæºäºç¨çä¸ä¸ªæºå¶ï¼MySQLéå¯¹ç¨æ·å 乿¯éæçï¼ | 表级éå® | è¡çº§éå®ã表级éå®ï¼éå®å度å°å¹¶åè½åé« | ### myisamchk æ¯ç¨æ¥åä»ä¹çï¼ å®ç¨æ¥å缩 MyISAM è¡¨ï¼ è¿åå°äºç£çæå å使ç¨ã MyISAM Static å MyISAM Dynamic æä»ä¹åºå«ï¼ å¨ MyISAM Static ä¸çææå段æåºå®å®½åº¦ã卿 MyISAM 表å°å ·æå TEXTï¼ BLOB çåæ®µï¼ 以éåºä¸åé¿åº¦çæ°æ®ç±»åã MyISAM Static å¨åææ åµä¸æ´å®¹ææ¢å¤ã ### 为ä»ä¹è¦å°½é设å®ä¸ä¸ªä¸»é®? 䏻鮿¯æ°æ®åºç¡®ä¿æ°æ®è¡å¨æ´å¼ 表å¯ä¸æ§çä¿é,å³ä½¿ä¸å¡ä¸æ¬å¼ 表没æä¸»é®,ä¹å»ºè®®æ·»å ä¸ä¸ªèªå¢é¿çIDåä½ä¸ºä¸»é®.设å®äºä¸»é®ä¹å,å¨åç»çå æ¹æ¥çæ¶åå¯è½æ´å å¿«é以åç¡®ä¿æä½æ°æ®èå´å®å ¨. ### 主é®ä½¿ç¨èªå¢IDè¿æ¯UUID? æ¨è使ç¨èªå¢ID,ä¸è¦ä½¿ç¨UUID. å 为å¨InnoDBåå¨å¼æä¸,主é®ç´¢å¼æ¯ä½ä¸ºèç°ç´¢å¼åå¨ç,ä¹å°±æ¯è¯´,主é®ç´¢å¼çB+æ å¶åèç¹ä¸åå¨äºä¸»é®ç´¢å¼ä»¥åå ¨é¨çæ°æ®(æç §é¡ºåº),妿䏻é®ç´¢å¼æ¯èªå¢ID,é£ä¹åªéè¦ä¸æååæåå³å¯,妿æ¯UUID,ç±äºå°æ¥çIDä¸åæ¥ç大å°ä¸ç¡®å®,ä¼é æé常å¤çæ°æ®æå ¥,æ°æ®ç§»å¨,ç¶å导è´äº§çå¾å¤çå åç¢ç,è¿èé ææå ¥æ§è½çä¸é. æ»ä¹,卿°æ®é大ä¸äºçæ åµä¸,ç¨èªå¢ä¸»é®æ§è½ä¼å¥½ä¸äº. *å¾çæ¥æºäºã髿§è½MySQLã: å ¶ä¸é»è®¤åç¼ä¸ºä½¿ç¨èªå¢ID,_uuid为使ç¨UUID为主é®çæµè¯,æµè¯äºæå ¥100wè¡å300wè¡çæ§è½.*  å ³äºä¸»é®æ¯èç°ç´¢å¼,å¦ææ²¡æä¸»é®,InnoDBä¼éæ©ä¸ä¸ªå¯ä¸é®æ¥ä½ä¸ºèç°ç´¢å¼,å¦ææ²¡æå¯ä¸é®,ä¼çæä¸ä¸ªéå¼ç主é®. > If you define a PRIMARY KEY on your table, InnoDB uses it as the clustered index. > > If you do not define a PRIMARY KEY for your table, MySQL picks the first UNIQUE index that has only NOT NULL columns as the primary key and InnoDB uses it as the clustered index. ### åæ®µä¸ºä»ä¹è¦æ±å®ä¹ä¸ºnot null? MySQLå®ç½è¿æ ·ä»ç»: > NULL columns require additional space in the rowto record whether their values are NULL. For MyISAM tables, each NULL columntakes one bit extra, rounded up to the nearest byte. nullå¼ä¼å ç¨æ´å¤çåè,ä¸ä¼å¨ç¨åºä¸é æå¾å¤ä¸é¢æä¸ç¬¦çæ åµ. ### 妿è¦åå¨ç¨æ·çå¯ç æ£å,åºè¯¥ä½¿ç¨ä»ä¹å段è¿è¡åå¨? å¯ç æ£å,ç,ç¨æ·èº«ä»½è¯å·çåºå®é¿åº¦çå符串åºè¯¥ä½¿ç¨charè䏿¯varcharæ¥åå¨,è¿æ ·å¯ä»¥èç空é´ä¸æé«æ£ç´¢æç. ### ç´¢å¼æ¯ä¸ªä»ä¹æ ·çæ°æ®ç»æå¢? ç´¢å¼çæ°æ®ç»æåå ·ä½åå¨å¼æçå®ç°æå ³, å¨MySQLä¸ä½¿ç¨è¾å¤çç´¢å¼æHashç´¢å¼,B+æ ç´¢å¼ç,èæä»¬ç»å¸¸ä½¿ç¨çInnoDBåå¨å¼æçé»è®¤ç´¢å¼å®ç°ä¸º:B+æ ç´¢å¼. ### å¯ä¸ç´¢å¼æ¯æ®éç´¢å¼å¿«å, 为ä»ä¹ å¯ä¸ç´¢å¼ä¸ä¸å®æ¯æ®éç´¢å¼å¿«, è¿å¯è½æ ¢. **1ãæ¥è¯¢æ¶,** 卿ªä½¿ç¨`limit 1`çæ åµä¸, å¨å¹é å°ä¸æ¡æ°æ®å, å¯ä¸ç´¢å¼å³è¿å, æ®éç´¢å¼ä¼ç»§ç»å¹é ä¸ä¸æ¡æ°æ®, åç°ä¸å¹é åè¿å. 妿¤çæ¥å¯ä¸ç´¢å¼å°äºä¸æ¬¡å¹é , ä½å®é ä¸è¿ä¸ªæ¶èå¾®ä¹å ¶å¾®. **2ãæ´æ°æ¶** , è¿ä¸ªæ åµå°±æ¯è¾å¤æäº. æ®éç´¢å¼å°è®°å½æ¾å°`change buffer`ä¸è¯å¥å°±æ§è¡å®æ¯äº. è对å¯ä¸ç´¢å¼èè¨, å®å¿ é¡»è¦æ ¡éªå¯ä¸æ§, å æ¤, å¿ é¡»å°æ°æ®é¡µè¯»å ¥å åç¡®å®æ²¡æå²çª, ç¶åæè½ç»§ç»æä½. 对äº**åå¤è¯»å°**çæ åµ, æ®éç´¢å¼å©ç¨`change buffer`ææåå°äºå¯¹ç£ççè®¿é®æ¬¡æ°, å æ¤æ®éç´¢å¼æ§è½è¦é«äºå¯ä¸ç´¢å¼. ### ç´¢å¼çä¼ç¼ºç¹ **ä¼ç¹** - æé«æ°æ®æ£ç´¢çæçï¼é使°æ®åºç IO ææ¬ã - éè¿ç´¢å¼åå¯¹æ°æ®è¿è¡æåºï¼é使°æ®æåºçææ¬ï¼éä½äº CPU çæ¶èã **缺ç¹** - è½ç¶ç´¢å¼å¤§å¤§æé«äºæ¥è¯¢é度ï¼åæ¶å´ä¼é使´æ°è¡¨çé度ï¼å¦å¯¹è¡¨è¿è¡ INSERTãUPDATE å DELETEãå ä¸ºæ´æ°è¡¨æ¶ï¼MySQL ä¸ä» è¦ä¿åæ°æ®ï¼è¿è¦ä¿åä¸ä¸ç´¢å¼æä»¶æ¯æ¬¡æ´æ°æ·»å äºç´¢å¼åçåæ®µï¼é½ä¼è°æ´å 为 æ´æ°æå¸¦æ¥çé®å¼åååçç´¢å¼ä¿¡æ¯ã - å®é ä¸ç´¢å¼ä¹æ¯ä¸å¼ 表ï¼è¯¥è¡¨ä¿åäºä¸»é®ä¸ç´¢å¼å段ï¼å¹¶æåå®ä½è¡¨çè®°å½ï¼æä»¥ç´¢å¼å乿¯è¦å ç¨ç©ºé´ çã ### åè¿åªäºMySQLç´¢å¼ç¸å ³ä¼å - å°½é使ç¨ä¸»é®æ¥è¯¢: èç°ç´¢å¼ä¸åå¨äºå ¨é¨æ°æ®, ç¸æ¯æ®éç´¢å¼æ¥è¯¢, åå°äºåè¡¨çæ¶è. - MySQL5.6ä¹åå¼å ¥äºç´¢å¼ä¸æ¨ä¼å, éè¿éå½ç使ç¨èåç´¢å¼, åå°åè¡¨å¤æçæ¶è. - è¥é¢ç¹æ¥è¯¢æä¸åæ°æ®, å¯ä»¥èèå©ç¨è¦çç´¢å¼é¿å å表. - èåç´¢å¼å°é«é¢å段æ¾å¨æå·¦è¾¹. ### æä¹çå°ä¸ºè¡¨æ ¼å®ä¹çææç´¢å¼ï¼ ç´¢å¼æ¯éè¿ä»¥ä¸æ¹å¼ä¸ºè¡¨æ ¼å®ä¹çï¼ SHOW INDEX FROM ; ### ç´¢å¼çåºç¡ - ç´¢å¼ç±»ä¼¼äºä¹¦ç±çç®å½ï¼è¦æ³æ¾å°ä¸æ¬æ°çæä¸ªç¹å®ä¸»é¢ï¼éè¦å æ¥æ¾ä¹¦çç®å½ï¼å®ä½å¯¹åºç页ç - åå¨å¼æä½¿ç¨ç±»ä¼¼çæ¹å¼è¿è¡æ°æ®æ¥è¯¢ï¼å å»ç´¢å¼å½ä¸æ¾å°å¯¹åºçå¼ï¼ç¶åæ ¹æ®å¹é çç´¢å¼æ¾å°å¯¹åºçæ°æ®è¡ã ### å建索å¼çè¯æ³ - é¦å å建ä¸ä¸ªè¡¨ï¼create table t1 (id int primary key,username varchar(20),password varchar(20)); - å建å个索å¼çè¯æ³ï¼CREATE INDEX ç´¢å¼å on 表åï¼å段åï¼ - ç´¢å¼åä¸è¬æ¯ï¼è¡¨å_åæ®µå - ç»idå建索å¼ï¼CREATE INDEX t1_id on t1(id); - å建èåç´¢å¼çè¯æ³ï¼CREATE INDEX ç´¢å¼å on 表åï¼å段å1ï¼å段å2ï¼ - ç»usernameåpasswordå建èåç´¢å¼ï¼CREATE index t1_username_password ON t1(username,password) - å ¶ä¸indexè¿å¯ä»¥æ¿æ¢æuniqueï¼primary keyï¼åå«ä»£è¡¨å¯ä¸ç´¢å¼å主é®ç´¢å¼ - å é¤ç´¢å¼ï¼DROP INDEX t1_username_password ON t1 ### ç´¢å¼å¯¹æ§è½çå½±åï¼ - 大大åå°æå¡å¨éè¦æ«æçæ°æ®éã - 叮婿å¡å¨é¿å æåºå临æ¶è¡¨ã - å°éæºI/Oå顺åºI/Oã - 大大æé«æ¥è¯¢é度ã - éä½åçé度ï¼ä¸è¯å½±åï¼ã - ç£çå ç¨ï¼ä¸è¯å½±åï¼ã ### ç´¢å¼çç±»å ç´¢å¼å¾å¤ç§ç±»åï¼æ¯å¨MySQLçåå¨å¼æå®ç°çã - æ®éç´¢å¼ï¼æåºæ¬çç´¢å¼ï¼æ²¡æä»»ä½çº¦æéå¶ã - å¯ä¸ç´¢å¼ï¼åæ®éç´¢å¼ç±»ä¼¼ï¼ä½æ¯å ·æå¯ä¸æ§çº¦æã - 主é®ç´¢å¼ï¼ç¹æ®çå¯ä¸ç´¢å¼ï¼ä¸å 许æç©ºå¼ã ### ç´¢å¼çåºå« -ä¸ä¸ªè¡¨åªè½æä¸ä¸ªä¸»é®ç´¢å¼ï¼ä½æ¯å¯ä»¥æå¤ä¸ªå¯ä¸ç´¢å¼ã - 主é®ç´¢å¼ä¸å®æ¯å¯ä¸ç´¢å¼ï¼å¯ä¸ç´¢å¼ä¸æ¯ä¸»é®ç´¢å¼ã - 主é®å¯ä»¥ä¸å¤é®ææåç §å®æ´æ§çº¦æï¼é²æ¢æ°æ®ä¸ä¸è´ã - èåç´¢å¼ï¼å°å¤ä¸ªåç»åå¨ä¸èµ·å建索å¼ï¼å¯ä»¥è¦çå¤ä¸ªåãï¼ä¹å«å¤åç´¢å¼ï¼ç»åç´¢å¼ï¼ - å¤é®ç´¢å¼ï¼åªæInnoDBç±»åç表æå¯ä»¥ä½¿ç¨å¤é®ç´¢å¼ï¼ä¿è¯æ°æ®çä¸è´æ§ã宿´æ§ãåå®ç°çº§èæä½ï¼åºæ¬ä¸ç¨ï¼ã - å ¨æç´¢å¼ï¼MySQLèªå¸¦çå ¨æç´¢å¼åªè½ç¨äºMyISAMï¼å¹¶ä¸åªè½å¯¹è±æè¿è¡å ¨ææ£ç´¢ ï¼åºæ¬ä¸ç¨ï¼ ### MySQLç´¢å¼çå建åå - æéåå建索å¼ç忝åºç°å¨WHEREæONåå¥ä¸çåï¼æè¿æ¥åå¥ä¸çåè䏿¯åºç°å¨SELECTå ³é®ååçåã - ç´¢å¼åçåºæ°è¶å¤§ï¼æ°æ®åºå度è¶é«ï¼ç´¢å¼çææè¶å¥½ã - 对äºå符串è¿è¡ç´¢å¼ï¼åºè¯¥å¶å®ä¸ä¸ªåç¼é¿åº¦ï¼å¯ä»¥èç大éçç´¢å¼ç©ºé´ã - æ ¹æ®æ åµå建èåç´¢å¼ï¼èåç´¢å¼å¯ä»¥æé«æ¥è¯¢æçã - é¿å å建è¿å¤çç´¢å¼ï¼ç´¢å¼ä¼é¢å¤å ç¨ç£ç空é´ï¼éä½åæä½æçã - 主é®å°½å¯è½éæ©è¾ççæ°æ®ç±»åï¼å¯ä»¥ææåå°ç´¢å¼çç£çå ç¨æé«æ¥è¯¢æçã ### ç´¢å¼ç使ç¨åºæ¯ - 对äºé常å°ç表ï¼å¤§é¨åæ åµä¸å ¨è¡¨æ«ææçæ´é«ã - ä¸å°å¤§å表ï¼ç´¢å¼é常ææã - ç¹å¤§åç表ï¼å»ºç«å使ç¨ç´¢å¼ç代价ä¼éä¹å¢å¤§ï¼å¯ä»¥ä½¿ç¨ååºææ¯æ¥è§£å³ã ### ç´¢å¼åç±» **åå¼ç´¢å¼ï¼** å³ä¸ä¸ªç´¢å¼åªå å«å个åï¼ä¸ä¸ªè¡¨å¯ä»¥æå¤ä¸ªååç´¢å¼ - 建表æ¶ï¼å ä¸ `key(åå)` æå® - åç¬å建ï¼`create index ç´¢å¼å on 表å(åå)` - åç¬å建ï¼`alter table 表å add index ç´¢å¼å(åå)` **å¯ä¸ç´¢å¼ï¼** ç´¢å¼åçå¼å¿ é¡»å¯ä¸ï¼ä½å 许æ null ä¸ null å¯ä»¥åºç°å¤æ¬¡ - 建表æ¶ï¼å ä¸ `unique(åå)` æå® - åç¬å建ï¼`create unique index idx_表å_åå on 表å(åå)` - åç¬å建ï¼`alter table 表å add unique ç´¢å¼å(åå)` **主é®ç´¢å¼ï¼** 设å®ä¸ºä¸»é®åæ°æ®åºä¼èªå¨å»ºç«ç´¢å¼ï¼innodb 为èç°ç´¢å¼ï¼å¼å¿ é¡»å¯ä¸ä¸ä¸è½ä¸º null - 建表æ¶ï¼å ä¸ `primary key(åå)` æå® **å¤åç´¢å¼ï¼** å³ä¸ä¸ªç´¢å¼å å«å¤ä¸ªå - 建表æ¶ï¼å ä¸ `key(ååå表)` æå® - åç¬å建ï¼`create index ç´¢å¼å on 表å(ååå表)` - åç¬å建ï¼`alter table 表å add index ç´¢å¼å(ååå表)` ### MySQLç´¢å¼ç注æäºé¡¹ **1ãèåç´¢å¼éµå¾ªåç¼åå** ``` KEY(a,b,c)WHERE a = 1 AND b = 2 AND c = 3WHERE a = 1 AND b = 2WHERE a = 1#以ä¸SQLè¯å¥å¯ä»¥ç¨å°ç´¢å¼WHERE b = 2 AND c = 3WHERE a = 1 AND c = 3#以ä¸SQLè¯å¥ç¨ä¸å°ç´¢å¼ ``` **2ãLIKEæ¥è¯¢ï¼%ä¸è½å¨å** ``` WHERE name LIKE "%wang%"#以ä¸è¯å¥ç¨ä¸å°ç´¢å¼ï¼å¯ä»¥ç¨å¤é¨çElasticSearchãLuceneçå ¨ææç´¢å¼ææ¿ä»£ã ``` **3ã** åå¼ä¸ºç©ºï¼NULLï¼æ¶æ¯å¯ä»¥ä½¿ç¨ç´¢å¼çï¼ä½MySQLé¾ä»¥ä¼åå¼ç¨äºå¯ç©ºåçæ¥è¯¢,å®ä¼ä½¿ç´¢å¼ãç´¢å¼ç»è®¡å弿´å 夿ãå¯ç©ºåéè¦æ´å¤çå¨å空é´ï¼è¿éè¦å¨MySQLå é¨è¿è¡ç¹æ®å¤çã **4ã** 妿MySQL估计使ç¨ç´¢å¼æ¯å ¨è¡¨æ«ææ´æ ¢ï¼ä¼æ¾å¼ä½¿ç¨ç´¢å¼ï¼ä¾å¦ï¼ 表ä¸åªæ100æ¡æ°æ®å·¦å³ã对äºSQLè¯å¥WHERE id > 1 AND id < 100ï¼MySQLä¼ä¼å èèå ¨è¡¨æ«æã **5ã** å¦æå ³é®è¯oråé¢çæ¡ä»¶ä¸çåæç´¢å¼ï¼åé¢ç没æï¼ææåçç´¢å¼é½ä¸ä¼è¢«ç¨å°ã **6ã** åç±»åæ¯åç¬¦ä¸²ï¼æ¥è¯¢æ¶ä¸å®è¦ç»å¼å å¼å·ï¼å¦åç´¢å¼å¤±æï¼ä¾å¦ï¼ åname varchar(16)ï¼åå¨äºå符串"100" WHERE name = 100; 以ä¸SQLè¯å¥è½æå°ï¼ä½æ æ³ç¨å°ç´¢å¼ã ### MySQLç´¢å¼çåç - MySQLç´¢å¼æ¯ç¨ä¸ç§å«åèç°ç´¢å¼çæ°æ®ç»æå®ç°çï¼ä¸é¢æä»¬å°±æ¥çä¸ä¸ä»ä¹æ¯èç°ç´¢å¼ã - èç°ç´¢å¼æ¯ä¸ç§æ°æ®å卿¹å¼ï¼å®å®é 䏿¯å¨åä¸ä¸ªç»æä¸ä¿åäºB+æ ç´¢å¼åæ°æ®è¡ï¼InnoDBè¡¨æ¯æç §èç°ç´¢å¼ç»ç»çï¼ç±»ä¼¼äºOracleçç´¢å¼ç»ç»è¡¨ï¼ã ``` 注ï¼B+ æ æ¯ä¸ç§æ æ°æ®ç»æï¼æ¯ä¸ä¸ªnåæåºæ ï¼æ¯ä¸ªèç¹é常æå¤ä¸ªå©åï¼ä¸æ£µB+æ å 嫿 ¹èç¹ãå é¨èç¹åå¶åèç¹ãæ ¹èç¹å¯è½æ¯ä¸ä¸ªå¶åèç¹ï¼ä¹å¯è½æ¯ä¸ä¸ªå å«ä¸¤ä¸ªæä¸¤ä¸ªä»¥ä¸å©åèç¹çèç¹ãB+ æ é常ç¨äºæ°æ®åºåæä½ç³»ç»çæä»¶ç³»ç»ä¸ãNTFS, ReiserFS, NSS, XFS, JFS, ReFS åBFSçæä»¶ç³»ç»é½å¨ä½¿ç¨B+æ ä½ä¸ºå æ°æ®ç´¢å¼ãB+ æ çç¹ç¹æ¯è½å¤ä¿ææ°æ®ç¨³å®æåºï¼å ¶æå ¥ä¸ä¿®æ¹æ¥æè¾ç¨³å®çå¯¹æ°æ¶é´å¤æåº¦ãB+ æ å ç´ èªåºåä¸æå ¥ã ``` InnoDBéè¿ä¸»é®èç°æ°æ®ï¼å¦ææ²¡æå®ä¹ä¸»é®ï¼ä¼éæ©ä¸ä¸ªå¯ä¸çé空索å¼ä»£æ¿ï¼å¦ææ²¡æè¿æ ·çç´¢å¼ï¼ä¼éå¼å®ä¹ä¸ªä¸»é®ä½ä¸ºèç°ç´¢å¼ã ä¸å¾å½¢è±¡è¯´æäºèç°ç´¢å¼è¡¨(InnoDB)åæ®éçå ç»ç»è¡¨(MyISAM)çåºå«ï¼ æå¸¸é®çMySQLé¢è¯é¢ä¸ââæ¯ä¸ªå¼å人åé½åºè¯¥ç¥é å¯¹äºæ®éçå ç»ç»è¡¨æ¥è¯´ï¼å³å¾ï¼ï¼è¡¨æ°æ®åç´¢å¼æ¯åå«åå¨çï¼ä¸»é®ç´¢å¼åäºçº§ç´¢å¼åå¨ä¸æ²¡æä»»ä½åºå«ã è对äºèç°ç´¢å¼è¡¨æ¥è¯´ï¼å·¦å¾ï¼ï¼è¡¨æ°æ®æ¯å主é®ä¸èµ·åå¨çï¼ä¸»é®ç´¢å¼çå¶ç»ç¹åå¨è¡æ°æ®ï¼äºçº§ç´¢å¼çå¶ç»ç¹åå¨è¡ç主é®å¼ã èç°ç´¢å¼è¡¨æå¤§éåº¦å°æé«äºI/Oå¯éååºç¨çæ§è½ï¼ä½å®ä¹æä»¥ä¸å 个éå¶ï¼ - 1ï¼æå ¥é度严éä¾èµäºæå ¥é¡ºåºï¼æç §ä¸»é®çé¡ºåºæå ¥æ¯æå¿«çæ¹å¼ï¼å¦åå°ä¼åºç°é¡µåè£ï¼ä¸¥é影忧è½ãå æ¤ï¼å¯¹äºInnoDBè¡¨ï¼æä»¬ä¸è¬é½ä¼å®ä¹ä¸ä¸ªèªå¢çIDå为主é®ã - 2ï¼æ´æ°ä¸»é®ç代价å¾é«ï¼å 为å°ä¼å¯¼è´è¢«æ´æ°çè¡ç§»å¨ãå æ¤ï¼å¯¹äºInnoDBè¡¨ï¼æä»¬ä¸è¬å®ä¹ä¸»é®ä¸ºä¸å¯æ´æ°ã - 3ï¼äºçº§ç´¢å¼è®¿é®éè¦ä¸¤æ¬¡ç´¢å¼æ¥æ¾ï¼ç¬¬ä¸æ¬¡æ¾å°ä¸»é®å¼ï¼ç¬¬äºæ¬¡æ ¹æ®ä¸»é®å¼æ¾å°è¡æ°æ®ã äºçº§ç´¢å¼çå¶èç¹åå¨çæ¯ä¸»é®å¼ï¼è䏿¯è¡æéï¼è¿æ¯ä¸ºäºåå°å½åºç°è¡ç§»å¨ææ°æ®é¡µåè£æ¶äºçº§ç´¢å¼çç»´æ¤å·¥ä½ï¼ä½ä¼è®©äºçº§ç´¢å¼å ç¨æ´å¤ç空é´ã #### è§£é¢æ¹æ³ å¨ä¸äºMySQLç´¢å¼åºç¡èé¢ä¸ï¼æä»¬å¯ä»¥è½»æ¾çéè¿ç´¢å¼åºç¡åç±»åæ¥è§£å³æ¤ç±»é®é¢ï¼å¯¹äºä¸äºç´¢å¼å建注æäºé¡¹æ¹é¢çèç¹ï¼æä»¬å¯ä»¥éè¿ç´¢å¼å建åååæ³¨æäºé¡¹æ¥è§£å³ã ### å建MySQLèåç´¢å¼åºè¯¥æ³¨æä»ä¹ï¼ ééµå¾ªåç¼åå ### åå¼ä¸ºNULLæ¶ï¼æ¥è¯¢æ¯å¦ä¼ç¨å°ç´¢å¼ï¼ å¨MySQLéNULLå¼çå乿¯èµ°ç´¢å¼çãå½ç¶ï¼å¦æè®¡å对åè¿è¡ç´¢å¼ï¼å°±è¦å°½éé¿å æå®è®¾ç½®ä¸ºå¯ç©ºï¼MySQLé¾ä»¥ä¼åå¼ç¨äºå¯ç©ºåçæ¥è¯¢,å®ä¼ä½¿ç´¢å¼ãç´¢å¼ç»è®¡å弿´å 夿ã ### 以ä¸è¯å¥æ¯å¦ä¼åºç¨ç´¢å¼ï¼SELECT FROM users WHERE YEAR(adddate) < 2007; ä¸ä¼ï¼å 为åªè¦åæ¶åå°è¿ç®ï¼MySQLå°±ä¸ä¼ä½¿ç¨ç´¢å¼ã ### MyISAMç´¢å¼å®ç°ï¼ MyISAMåå¨å¼æä½¿ç¨B+Treeä½ä¸ºç´¢å¼ç»æï¼å¶èç¹çdataååæ¾çæ¯æ°æ®è®°å½çå°åãMyISAMçç´¢å¼æ¹å¼ä¹å«åéèç°ç´¢å¼çï¼ä¹æä»¥è¿ä¹ç§°å¼æ¯ä¸ºäºä¸InnoDBçèç°ç´¢å¼åºåã ### MyISAMç´¢å¼ä¸InnoDBç´¢å¼çåºå«ï¼ - InnoDBç´¢å¼æ¯èç°ç´¢å¼ï¼MyISAMç´¢å¼æ¯éèç°ç´¢å¼ã - InnoDBç主é®ç´¢å¼çå¶åèç¹åå¨çè¡æ°æ®ï¼å æ¤ä¸»é®ç´¢å¼é叏髿ã - MyISAMç´¢å¼çå¶åèç¹åå¨çæ¯è¡æ°æ®å°åï¼éè¦å寻å䏿¬¡æè½å¾å°æ°æ®ã - InnoDBé主é®ç´¢å¼çå¶åèç¹åå¨çæ¯ä¸»é®åå ¶ä»å¸¦ç´¢å¼çåæ°æ®ï¼å æ¤æ¥è¯¢æ¶åå°è¦çç´¢å¼ä¼é叏髿ã ### 使ç¨ç´¢å¼æ¥è¯¢ä¸å®è½æé«æ¥è¯¢çæ§è½åï¼ä¸ºä»ä¹ é常,éè¿ç´¢å¼æ¥è¯¢æ°æ®æ¯å ¨è¡¨æ«æè¦å¿«.使¯æä»¬ä¹å¿ 须注æå°å®ç代价. > 1ãç´¢å¼éè¦ç©ºé´æ¥åå¨,ä¹éè¦å®æç»´æ¤, æ¯å½æè®°å½å¨è¡¨ä¸å¢åæç´¢å¼åè¢«ä¿®æ¹æ¶,ç´¢å¼æ¬èº«ä¹ä¼è¢«ä¿®æ¹. è¿æå³çæ¯æ¡è®°å½çINSERT,DELETE,UPDATEå°ä¸ºæ¤å¤ä»åº4,5 次çç£çI/O. å 为索å¼éè¦é¢å¤çåå¨ç©ºé´åå¤ç,é£äºä¸å¿ è¦çç´¢å¼åèä¼ä½¿æ¥è¯¢ååºæ¶é´åæ ¢.使ç¨ç´¢å¼æ¥è¯¢ä¸ä¸å®è½æé«æ¥è¯¢æ§è½,ç´¢å¼èå´æ¥è¯¢(INDEX RANGE SCAN)éç¨äºä¸¤ç§æ åµ: > 2ãåºäºä¸ä¸ªèå´çæ£ç´¢,ä¸è¬æ¥è¯¢è¿åç»æéå°äºè¡¨ä¸è®°å½æ°ç30% > 3ãåºäºéå¯ä¸æ§ç´¢å¼çæ£ç´¢ ### ä»ä¹æ åµä¸è®¾ç½®äºç´¢å¼ä½æ æ³ä½¿ç¨ **1ã** 以â%â å¼å¤´ç LIKE è¯å¥ï¼ 模ç³å¹é **2ã** OR è¯å¥ååæ²¡æåæ¶ä½¿ç¨ç´¢å¼ **3ã** æ°æ®ç±»ååºç°éå¼è½¬åï¼ å¦ varchar ä¸å åå¼å·çè¯å¯è½ä¼èªå¨è½¬æ¢ä¸º int åï¼ ### è¶ é®ãåéé®ã主é®ãå¤é®å嫿¯ä»ä¹ï¼ **1ãè¶ é®ï¼** å¨å ³ç³»ä¸è½å¯ä¸æ è¯å ç»ç屿§éç§°ä¸ºå ³ç³»æ¨¡å¼çè¶ é®ãä¸ä¸ªå±æ§å¯ä»¥ä¸ºä½ä¸ºä¸ä¸ªè¶ é®ï¼å¤ä¸ªå±æ§ç»åå¨ä¸èµ·ä¹å¯ä»¥ä½ä¸ºä¸ä¸ªè¶ é®ãè¶ é®å å«åéé®å主é®ã **2ãåéé®ï¼** æ¯æå°è¶ é®ï¼å³æ²¡æåä½å ç´ çè¶ é®ã **3ã主é®ï¼** æ°æ®åºè¡¨ä¸å¯¹å¨åæ°æ®å¯¹è±¡äºä»¥å¯ä¸å宿´æ è¯çæ°æ®åæå±æ§çç»åãä¸ä¸ªæ°æ®ååªè½æä¸ä¸ªä¸»é®ï¼ä¸ä¸»é®çåå¼ä¸è½ç¼ºå¤±ï¼å³ä¸è½ä¸ºç©ºå¼ï¼Nullï¼ã **4ãå¤é®ï¼** å¨ä¸ä¸ªè¡¨ä¸åå¨çå¦ä¸ä¸ªè¡¨ç主é®ç§°æ¤è¡¨çå¤é®ã ### ç®å说ä¸è¯´dropãdeleteä¸truncateçåºå« SQLä¸çdropãdeleteãtruncateé½è¡¨ç¤ºå é¤ï¼ä½æ¯ä¸è æä¸äºå·®å« > 1ãdeleteåtruncateåªå é¤è¡¨çæ°æ®ä¸å é¤è¡¨çç»æ > 2ãé度,ä¸è¬æ¥è¯´: drop> truncate >delete > 3ãdeleteè¯å¥æ¯dml,è¿ä¸ªæä½ä¼æ¾å°rollback segementä¸,äºå¡æäº¤ä¹åæçæ; > 4ã妿æç¸åºçtrigger,æ§è¡çæ¶åå°è¢«è§¦å. truncate,dropæ¯ddl, æä½ç«å³çæ,åæ°æ®ä¸æ¾å°rollback segmentä¸,ä¸è½åæ». æä½ä¸è§¦åtrigger. ### dropãdeleteä¸truncateåå«å¨ä»ä¹åºæ¯ä¹ä¸ä½¿ç¨ï¼ **1ã** ä¸åéè¦ä¸å¼ è¡¨çæ¶åï¼ç¨drop **2ã** æ³å é¤é¨åæ°æ®è¡æ¶åï¼ç¨deleteï¼å¹¶ä¸å¸¦ä¸whereåå¥ **3ã** ä¿ç表èå é¤æææ°æ®çæ¶åç¨truncate ### B-Tree å B+Tree **åºå«** 1. B-Tree çå ³é®ååè®°å½æ¯æ¾å¨ä¸èµ·çï¼å¶åèç¹å¯ä»¥çä½å¤é¨èç¹ï¼ä¸å å«ä»»ä½ä¿¡æ¯ï¼B+Tree çéå¶åèç¹ä¸åªæå ³é®ååæåä¸ä¸ä¸ªèç¹çç´¢å¼ï¼è®°å½åªæ¾å¨å¶åèç¹ä¸ã 2. å¨ B-Tree ä¸ï¼è¶é è¿æ ¹èç¹çè®°å½æ¥æ¾æ¶é´è¶å¿«ï¼åªè¦æ¾å°å ³é®åå³å¯ç¡®å®è®°å½çåå¨ï¼è B+Tree 䏿¯ä¸ªè®°å½çæ¥æ¾æ¶é´åºæ¬æ¯ä¸æ ·çï¼é½éè¦ä»æ ¹èç¹èµ°å°å¶åèç¹ï¼èä¸å¨å¶åèç¹ä¸è¿è¦åæ¯è¾å ³é®åãä»è¿ä¸ªè§åº¦ç B-Tree çæ§è½å¥½åè¦æ¯ B+Tree 好ï¼èå¨å®é åºç¨ä¸å´æ¯ B+Tree çæ§è½è¦å¥½äºãå 为 B+Tree çéå¶åèç¹ä¸åæ¾å®é çæ°æ®ï¼è¿æ ·æ¯ä¸ªèç¹å¯å®¹çº³çå ç´ ä¸ªæ°æ¯ B-Tree å¤ï¼æ 髿¯ B-Tree å°ï¼è¿æ ·å¸¦æ¥ç好夿¯åå°ç£çè®¿é®æ¬¡æ°ã尽管 B+Tree æ¾å°ä¸ä¸ªè®°å½æéçæ¯è¾æ¬¡æ°è¦æ¯ B-Tree å¤ï¼ä½æ¯ä¸æ¬¡ç£ç访é®çæ¶é´ç¸å½äºæç¾ä¸å次å 忝è¾çæ¶é´ï¼å æ¤å®é ä¸ B+Tree çæ§è½å¯è½è¿ä¼å¥½äºï¼èä¸ B+Tree çå¶åèç¹ä½¿ç¨æéè¿æ¥å¨ä¸èµ·ï¼æ¹ä¾¿é¡ºåºéåï¼ä¾å¦æ¥çä¸ä¸ªç®å½ä¸çæææä»¶ï¼ä¸ä¸ªè¡¨ä¸çææè®°å½çï¼ï¼è¿ä¹æ¯å¾å¤æ°æ®åºåæä»¶ç³»ç»ä½¿ç¨ B+Tree çç¼æ ã ### 为ä»ä¹ B+Tree æ¯ B-Tree æ´éåå®é åºç¨ä¸æä½ç³»ç»çæä»¶ç´¢å¼åæ°æ®åºç´¢å¼ï¼** 1. B+Tree çç£ç读å代价æ´ä½ > B+Tree çå é¨ç»ç¹å¹¶æ²¡ææåå ³é®åå ·ä½ä¿¡æ¯çæéãå æ¤å ¶å é¨ç»ç¹ç¸å¯¹ B-Tree æ´å°ãå¦ææææåä¸å é¨ç»ç¹çå ³é®ååæ¾å¨åä¸çåä¸ï¼é£ä¹çåæè½å®¹çº³çå ³é®åæ°éä¹è¶å¤ã䏿¬¡æ§è¯»å ¥å åä¸çéè¦æ¥æ¾çå ³é®åä¹å°±è¶å¤ãç¸å¯¹æ¥è¯´ IO è¯»åæ¬¡æ°ä¹å°±éä½äºã 1. B+Tree çæ¥è¯¢æçæ´å ç¨³å® > ç±äºéç»ç»ç¹å¹¶ä¸æ¯æç»æåæä»¶å 容çç»ç¹ï¼èåªæ¯å¶åç»ç¹ä¸å ³é®åçç´¢å¼ãæä»¥ä»»ä½å ³é®åçæ¥æ¾å¿ é¡»èµ°ä¸æ¡ä»æ ¹ç»ç¹å°å¶åç»ç¹çè·¯ãææå ³é®åæ¥è¯¢çè·¯å¾é¿åº¦ç¸åï¼å¯¼è´æ¯ä¸ä¸ªæ°æ®çæ¥è¯¢æçç¸å½ã ### ä»ä¹æ¯è§å¾ï¼ä»¥åè§å¾ç使ç¨åºæ¯æåªäºï¼ **1ã** è§å¾æ¯ä¸ç§èæç表ï¼å ·æåç©ç表ç¸åçåè½ãå¯ä»¥å¯¹è§å¾è¿è¡å¢ï¼æ¹ï¼æ¥ï¼æä½ï¼è¯å¾éå¸¸æ¯æä¸ä¸ªè¡¨æè å¤ä¸ªè¡¨çè¡æåçåéã对è§å¾çä¿®æ¹ä¸å½±ååºæ¬è¡¨ãå®ä½¿å¾æä»¬è·åæ°æ®æ´å®¹æï¼ç¸æ¯å¤è¡¨æ¥è¯¢ã **2ã** åªæ´é²é¨ååæ®µç»è®¿é®è ï¼æä»¥å°±å»ºä¸ä¸ªè表ï¼å°±æ¯è§å¾ã **3ã** æ¥è¯¢çæ°æ®æ¥æºäºä¸åç表ï¼èæ¥è¯¢è 叿以ç»ä¸çæ¹å¼æ¥è¯¢ï¼è¿æ ·ä¹å¯ä»¥å»ºç«ä¸ä¸ªè§å¾ï¼æå¤ä¸ªè¡¨æ¥è¯¢ç»æèåèµ·æ¥ï¼æ¥è¯¢è åªéè¦ç´æ¥ä»è§å¾ä¸è·åæ°æ®ï¼ä¸å¿ èèæ°æ®æ¥æºäºä¸å表æå¸¦æ¥çå·®å¼ ### Hashç´¢å¼åB+æ æææä»ä¹åºå«æè 说ä¼å£å¢? é¦å è¦ç¥éHashç´¢å¼åB+æ ç´¢å¼çåºå±å®ç°åç: hashç´¢å¼åºå±å°±æ¯hash表,è¿è¡æ¥æ¾æ¶,è°ç¨ä¸æ¬¡hash彿°å°±å¯ä»¥è·åå°ç¸åºçé®å¼,ä¹åè¿è¡å表æ¥è¯¢è·å¾å®é æ°æ®.B+æ åºå±å®ç°æ¯å¤è·¯å¹³è¡¡æ¥æ¾æ .å¯¹äºæ¯ä¸æ¬¡çæ¥è¯¢é½æ¯ä»æ ¹èç¹åºå,æ¥æ¾å°å¶åèç¹æ¹å¯ä»¥è·å¾ææ¥é®å¼,ç¶åæ ¹æ®æ¥è¯¢å¤ææ¯å¦éè¦å表æ¥è¯¢æ°æ®. é£ä¹å¯ä»¥çåºä»ä»¬æä»¥ä¸çä¸å: - hashç´¢å¼è¿è¡ç弿¥è¯¢æ´å¿«(ä¸è¬æ åµä¸),使¯å´æ æ³è¿è¡èå´æ¥è¯¢. å 为å¨hashç´¢å¼ä¸ç»è¿hash彿°å»ºç«ç´¢å¼ä¹å,ç´¢å¼ç顺åºä¸åé¡ºåºæ æ³ä¿æä¸è´,ä¸è½æ¯æèå´æ¥è¯¢.èB+æ ççææèç¹çéµå¾ª(å·¦èç¹å°äºç¶èç¹,å³èç¹å¤§äºç¶èç¹,å¤åæ ä¹ç±»ä¼¼),å¤©ç¶æ¯æèå´. - hashç´¢å¼ä¸æ¯æä½¿ç¨ç´¢å¼è¿è¡æåº,åçåä¸. - hashç´¢å¼ä¸æ¯ææ¨¡ç³æ¥è¯¢ä»¥åå¤åç´¢å¼çæå·¦åç¼å¹é .åç乿¯å 为hash彿°çä¸å¯é¢æµ.**AAAA**å**AAAAB**çç´¢å¼æ²¡æç¸å ³æ§. - hashç´¢å¼ä»»ä½æ¶åé½é¿å ä¸äºå表æ¥è¯¢æ°æ®,èB+æ å¨ç¬¦åæäºæ¡ä»¶(èç°ç´¢å¼,è¦çç´¢å¼ç)çæ¶åå¯ä»¥åªéè¿ç´¢å¼å®ææ¥è¯¢. - hashç´¢å¼è½ç¶å¨ç弿¥è¯¢ä¸è¾å¿«,使¯ä¸ç¨³å®.æ§è½ä¸å¯é¢æµ,å½æä¸ªé®å¼åå¨å¤§ééå¤çæ¶å,åçhash碰æ,æ¤æ¶æçå¯è½æå·®.èB+æ çæ¥è¯¢æçæ¯è¾ç¨³å®,å¯¹äºææçæ¥è¯¢é½æ¯ä»æ ¹èç¹å°å¶åèç¹,䏿 çé«åº¦è¾ä½. å æ¤,å¨å¤§å¤æ°æ åµä¸,ç´æ¥éæ©B+æ ç´¢å¼å¯ä»¥è·å¾ç¨³å®ä¸è¾å¥½çæ¥è¯¢é度.èä¸éè¦ä½¿ç¨hashç´¢å¼. ### 为ä»ä¹ç¨ B+ æ åç´¢å¼èä¸ç¨åå¸è¡¨åç´¢å¼? **1ã** åå¸è¡¨æ¯æç´¢å¼å段æ 尿坹åºçåå¸ç ç¶åååæ¾å¨å¯¹åºçä½ç½®ï¼è¿æ ·çè¯ï¼å¦ææä»¬è¦è¿è¡æ¨¡ç³æ¥æ¾çè¯ï¼æ¾ç¶åå¸è¡¨è¿ç§ç»ææ¯ä¸æ¯æçï¼åªè½éåè¿ä¸ªè¡¨ãèB+æ åå¯ä»¥éè¿æå·¦åç¼ååå¿«éæ¾å°å¯¹åºçæ°æ®ã **2ã** 妿æä»¬è¦è¿è¡èå´æ¥æ¾ï¼ä¾å¦æ¥æ¾ID为100 ~ 400ç人ï¼åå¸è¡¨åæ ·ä¸æ¯æï¼åªè½éåå ¨è¡¨ã **3ã** ç´¢å¼å段éè¿å叿 å°æåå¸ç ï¼å¦æå¾å¤å段é½å好æ å°å°ç¸åå¼çåå¸ç çè¯ï¼é£ä¹å½¢æçç´¢å¼ç»æå°ä¼æ¯ä¸æ¡å¾é¿ç**é¾è¡¨**ï¼è¿æ ·çè¯ï¼æ¥æ¾çæ¶é´å°±ä¼å¤§å¤§å¢å ã ### ç´¢å¼æ¯ä»ä¹ï¼æä»ä¹ä½ç¨ä»¥åä¼ç¼ºç¹ï¼ **1ã** ç´¢å¼æ¯å¯¹æ°æ®åºè¡¨ä¸ä¸æå¤ä¸ªåçå¼è¿è¡æåºçç»æï¼æ¯å¸®å©MySQL髿è·åæ°æ®çæ°æ®ç»æ **2ã** ç´¢å¼å°±æ¯å å¿«æ£ç´¢è¡¨ä¸æ°æ®çæ¹æ³ãæ°æ®åºçç´¢å¼ç±»ä¼¼äºä¹¦ç±çç´¢å¼ãå¨ä¹¦ç±ä¸ï¼ç´¢å¼å è®¸ç¨æ·ä¸å¿ ç¿»é 宿´ä¸ªä¹¦å°±è½è¿ éå°æ¾å°æéè¦çä¿¡æ¯ã卿°æ®åºä¸ï¼ç´¢å¼ä¹å è®¸æ°æ®åºç¨åºè¿ éå°æ¾å°è¡¨ä¸çæ°æ®ï¼èä¸å¿ æ«ææ´ä¸ªæ°æ®åºã **MySQLæ°æ®åºå ä¸ªåºæ¬çç´¢å¼ç±»åï¼æ®éç´¢å¼ãå¯ä¸ç´¢å¼ã主é®ç´¢å¼ãå ¨æç´¢å¼** **1ã** ç´¢å¼å å¿«æ°æ®åºçæ£ç´¢é度 **2ã** ç´¢å¼éä½äºæå ¥ãå é¤ãä¿®æ¹çç»´æ¤ä»»å¡çé度 **3ã** å¯ä¸ç´¢å¼å¯ä»¥ç¡®ä¿æ¯ä¸è¡æ°æ®çå¯ä¸æ§ **4ã** éè¿ä½¿ç¨ç´¢å¼ï¼å¯ä»¥å¨æ¥è¯¢çè¿ç¨ä¸ä½¿ç¨ä¼åéèå¨ï¼æé«ç³»ç»çæ§è½ **5ã** ç´¢å¼éè¦å ç©çåæ°æ®ç©ºé´ ### ä¸é¢æå°äºB+æ 卿»¡è¶³èç°ç´¢å¼åè¦çç´¢å¼çæ¶åä¸éè¦å表æ¥è¯¢æ°æ®,ä»ä¹æ¯èç°ç´¢å¼? å¨B+æ çç´¢å¼ä¸,å¶åèç¹å¯è½åå¨äºå½åçkeyå¼,ä¹å¯è½åå¨äºå½åçkeyå¼ä»¥åæ´è¡çæ°æ®,è¿å°±æ¯èç°ç´¢å¼åéèç°ç´¢å¼. å¨InnoDBä¸,åªæä¸»é®ç´¢å¼æ¯èç°ç´¢å¼,å¦ææ²¡æä¸»é®,åæéä¸ä¸ªå¯ä¸é®å»ºç«èç°ç´¢å¼.å¦ææ²¡æå¯ä¸é®,åéå¼ççæä¸ä¸ªé®æ¥å»ºç«èç°ç´¢å¼. 彿¥è¯¢ä½¿ç¨èç°ç´¢å¼æ¶,å¨å¯¹åºçå¶åèç¹,å¯ä»¥è·åå°æ´è¡æ°æ®,å æ¤ä¸ç¨å次è¿è¡å表æ¥è¯¢. ### éèç°ç´¢å¼ä¸å®ä¼å表æ¥è¯¢å? ä¸ä¸å®,è¿æ¶åå°æ¥è¯¢è¯å¥æè¦æ±çåæ®µæ¯å¦å ¨é¨å½ä¸äºç´¢å¼,å¦æå ¨é¨å½ä¸äºç´¢å¼,é£ä¹å°±ä¸å¿ åè¿è¡å表æ¥è¯¢. 举个ç®åçä¾å,å设æä»¬å¨å工表çå¹´é¾ä¸å»ºç«äºç´¢å¼,é£ä¹å½è¿è¡`select age from employee where age < 20`çæ¥è¯¢æ¶,å¨ç´¢å¼çå¶åèç¹ä¸,å·²ç»å å«äºageä¿¡æ¯,ä¸ä¼å次è¿è¡å表æ¥è¯¢. ### å¨å»ºç«ç´¢å¼çæ¶å,齿åªäºéè¦èèçå ç´ å¢? 建ç«ç´¢å¼çæ¶åä¸è¬è¦èèå°å段ç使ç¨é¢ç,ç»å¸¸ä½ä¸ºæ¡ä»¶è¿è¡æ¥è¯¢çåæ®µæ¯è¾éå.妿éè¦å»ºç«èåç´¢å¼çè¯,è¿éè¦èèèåç´¢å¼ä¸ç顺åº.æ¤å¤ä¹è¦èèå ¶ä»æ¹é¢,æ¯å¦é²æ¢è¿å¤çææå¯¹è¡¨é æå¤ªå¤§çåå.è¿äºé½åå®é çè¡¨ç»æä»¥åæ¥è¯¢æ¹å¼æå ³. ### èåç´¢å¼æ¯ä»ä¹?为ä»ä¹éè¦æ³¨æèåç´¢å¼ä¸ç顺åº? MySQLå¯ä»¥ä½¿ç¨å¤ä¸ªåæ®µåæ¶å»ºç«ä¸ä¸ªç´¢å¼,å«åèåç´¢å¼.å¨èåç´¢å¼ä¸,妿æ³è¦å½ä¸ç´¢å¼,éè¦æç §å»ºç«ç´¢å¼æ¶çåæ®µé¡ºåºæ¨ä¸ªä½¿ç¨,å¦åæ æ³å½ä¸ç´¢å¼. å ·ä½åå 为: MySQL使ç¨ç´¢å¼æ¶éè¦ç´¢å¼æåº,å设ç°å¨å»ºç«äº"name,age,school"çèåç´¢å¼,é£ä¹ç´¢å¼çæåºä¸º: å æç §nameæåº,妿nameç¸å,åæç §ageæåº,妿ageçå¼ä¹ç¸ç,åæç §schoolè¿è¡æåº. å½è¿è¡æ¥è¯¢æ¶,æ¤æ¶ç´¢å¼ä» ä» æç §nameä¸¥æ ¼æåº,å æ¤å¿ é¡»é¦å 使ç¨nameåæ®µè¿è¡ç弿¥è¯¢,ä¹å对äºå¹é å°çåèè¨,å ¶æç §ageåæ®µä¸¥æ ¼æåº,æ¤æ¶å¯ä»¥ä½¿ç¨ageåæ®µç¨åç´¢å¼æ¥æ¾,,,以æ¤ç±»æ¨.å æ¤å¨å»ºç«èåç´¢å¼çæ¶ååºè¯¥æ³¨æç´¢å¼åç顺åº,ä¸è¬æ åµä¸,å°æ¥è¯¢éæ±é¢ç¹æè åæ®µéæ©æ§é«çåæ¾å¨åé¢.æ¤å¤å¯ä»¥æ ¹æ®ç¹ä¾çæ¥è¯¢æè è¡¨ç»æè¿è¡åç¬çè°æ´. ### å建çç´¢å¼ææ²¡æè¢«ä½¿ç¨å°?æè 说æä¹æå¯ä»¥ç¥éè¿æ¡è¯å¥è¿è¡å¾æ ¢çåå ? MySQLæä¾äºexplainå½ä»¤æ¥æ¥çè¯å¥çæ§è¡è®¡å,MySQL卿§è¡æä¸ªè¯å¥ä¹å,ä¼å°è¯¥è¯å¥è¿ä¸éæ¥è¯¢ä¼åå¨,ä¹å伿¿å°å¯¹è¯å¥çåæ,ä¹å°±æ¯æ§è¡è®¡å,å ¶ä¸å å«äºè®¸å¤ä¿¡æ¯. å¯ä»¥éè¿å ¶ä¸åç´¢å¼æå ³çä¿¡æ¯æ¥åææ¯å¦å½ä¸äºç´¢å¼,ä¾å¦possilbe_key,key,key_lençåæ®µ,åå«è¯´æäºæ¤è¯å¥å¯è½ä¼ä½¿ç¨çç´¢å¼,å®é 使ç¨çç´¢å¼ä»¥å使ç¨çç´¢å¼é¿åº¦. ### é£ä¹å¨åªäºæ åµä¸ä¼åçé对该åå建äºç´¢å¼ä½æ¯å¨æ¥è¯¢çæ¶å并没æä½¿ç¨å¢? - 使ç¨ä¸çäºæ¥è¯¢, - ååä¸äºæ°å¦è¿ç®æè 彿° - å¨å符串likeæ¶å·¦è¾¹æ¯éé 符.类似äº'%aaa'. - å½mysqlåæå ¨è¡¨æ«ææ¯ä½¿ç¨ç´¢å¼å¿«çæ¶åä¸ä½¿ç¨ç´¢å¼. - å½ä½¿ç¨èåç´¢å¼,åé¢ä¸ä¸ªæ¡ä»¶ä¸ºèå´æ¥è¯¢,åé¢çå³ä½¿ç¬¦åæå·¦åç¼åå,乿 æ³ä½¿ç¨ç´¢å¼. 以䏿 åµ,MySQLæ æ³ä½¿ç¨ç´¢å¼. ### ä»ä¹æ¯äºå¡? **äºå¡æ¯é»è¾ä¸çä¸ç»æä½ï¼è¦ä¹é½æ§è¡ï¼è¦ä¹é½ä¸æ§è¡ã** çè§£ä»ä¹æ¯äºå¡æç»å ¸çå°±æ¯è½¬è´¦çæ å,ç¸ä¿¡å¤§å®¶ä¹é½äºè§£,è¿éå°±ä¸å说ä¸è¾¹äº. äºå¡æ¯ä¸ç³»åçæä½,ä»ä»¬è¦ç¬¦åACIDç¹æ§.æå¸¸è§çç解就æ¯:äºå¡ä¸çæä½è¦ä¹å ¨é¨æå,è¦ä¹å ¨é¨å¤±è´¥.使¯åªæ¯è¿æ ·è¿ä¸å¤ç. ### æ°æ®åºçä¹è§éåæ²è§éæ¯ä»ä¹ï¼ æ°æ®åºç®¡çç³»ç»ï¼DBMSï¼ä¸çå¹¶åæ§å¶ç任塿¯ç¡®ä¿å¨å¤ä¸ªäºå¡åæ¶ååæ°æ®åºä¸å䏿°æ®æ¶ä¸ç ´åäºå¡çé离æ§åç»ä¸æ§ä»¥åæ°æ®åºçç»ä¸æ§ãä¹è§å¹¶åæ§å¶(ä¹è§é)åæ²è§å¹¶åæ§å¶ï¼æ²è§éï¼æ¯å¹¶åæ§å¶ä¸»è¦éç¨çææ¯ææ®µã **æ²è§éï¼** åå®ä¼åçå¹¶åå²çªï¼å±è½ä¸åå¯è½è¿åæ°æ®å®æ´æ§çæä½ **ä¹è§éï¼** å设ä¸ä¼åçå¹¶åå²çªï¼åªå¨æäº¤æä½æ¶æ£æ¥æ¯å¦è¿åæ°æ®å®æ´æ§ã ### ACIDæ¯ä»ä¹?å¯ä»¥è¯¦ç»è¯´ä¸ä¸å? **A=Atomicity** **ååæ§ï¼** å°±æ¯ä¸é¢è¯´ç,è¦ä¹å ¨é¨æå,è¦ä¹å ¨é¨å¤±è´¥.ä¸å¯è½åªæ§è¡ä¸é¨åæä½. **C=Consistency** **ä¸è´æ§ï¼** ç³»ç»(æ°æ®åº)æ»æ¯ä»ä¸ä¸ªä¸è´æ§çç¶æè½¬ç§»å°å¦ä¸ä¸ªä¸è´æ§çç¶æ,ä¸ä¼åå¨ä¸é´ç¶æ. **I=Isolation** **é离æ§:** é常æ¥è¯´:ä¸ä¸ªäºå¡å¨å®å ¨æäº¤ä¹å,å¯¹å ¶ä»äºå¡æ¯ä¸å¯è§ç.注æåé¢çé常æ¥è¯´å äºçº¢è²,æå³çæä¾å¤æ åµ. **D=Durability** **æä¹ æ§ï¼** 䏿¦äºå¡æäº¤,é£ä¹å°±æ°¸è¿æ¯è¿æ ·åäº,åªæç³»ç»å´©æºä¹ä¸ä¼å½±åå°è¿ä¸ªäºå¡çç»æ. ### åæ¶æå¤ä¸ªäºå¡å¨è¿è¡ä¼æä¹æ ·å¢? **äºå¡ï¼ transactionï¼** æ¯ä½ä¸ºä¸ä¸ªåå çä¸ç»æåºçæ°æ®åºæä½ã妿ç»ä¸çæææä½é½æåï¼ å认为äºå¡æåï¼ å³ä½¿åªæä¸ä¸ªæä½å¤±è´¥ï¼ äºå¡ä¹ä¸æåãå¦ææææä½å®æï¼ äºå¡åæäº¤ï¼ å ¶ä¿®æ¹å°ä½ç¨äºææå ¶ä»æ°æ®åºè¿ç¨ã妿ä¸ä¸ªæä½å¤±è´¥ï¼ åäºå¡å°åæ»ï¼ 该äºå¡æææä½çå½±åé½å°åæ¶ã **äºå¡ç¹æ§ï¼** **1ãååæ§ã** å³ä¸å¯å岿§ï¼ äºå¡è¦ä¹å ¨é¨è¢«æ§è¡ï¼ è¦ä¹å°±å ¨é¨ä¸è¢«æ§è¡ã **2ãä¸è´æ§æå¯ä¸²æ§ã** äºå¡çæ§è¡ä½¿å¾æ°æ®åºä»ä¸ç§æ£ç¡®ç¶æè½¬æ¢æå¦ä¸ç§æ£ç¡®ç¶ æ **3ãé离æ§ã** å¨äºå¡æ£ç¡®æäº¤ä¹åï¼ä¸å 许æè¯¥äºå¡å¯¹æ°æ®ç任使¹åæä¾ç»ä»»ä½ å ¶ä»äºå¡ï¼ **4ãæä¹ æ§ã** äºå¡æ£ç¡®æäº¤åï¼ å ¶ç»æå°æ°¸ä¹ ä¿å卿°æ®åºä¸ï¼ å³ä½¿å¨äºå¡æäº¤åæäºå ¶ä»æ éï¼ äºå¡çå¤çç»æä¹ä¼å¾å°ä¿åãæè è¿æ ·çè§£ï¼äºå¡å°±æ¯è¢«ç»å®å¨ä¸èµ·ä½ä¸ºä¸ä¸ªé»è¾å·¥ä½åå ç SQL è¯å¥åç»ï¼ 妿任ä½ä¸ä¸ªè¯å¥æä½å¤±è´¥é£ä¹æ´ä¸ªæä½å°±è¢«å¤±è´¥ï¼ 以åæä½å°±ä¼åæ»å°æä½åç¶æï¼ æè æ¯ä¸æä¸ªèç¹ã为äºç¡®ä¿è¦ä¹æ§è¡ï¼ è¦ä¹ä¸æ§è¡ï¼ å°±å¯ä»¥ä½¿ç¨äºå¡ãè¦å°æç»è¯å¥ä½ä¸ºäºå¡èèï¼ å°±éè¦éè¿ ACID æµè¯ï¼ å³ååæ§ï¼ ä¸è´æ§ï¼ é离æ§åæä¹ æ§ã ### Myql ä¸çäºå¡åæ»æºå¶æ¦è¿° äºå¡æ¯ç¨æ·å®ä¹çä¸ä¸ªæ°æ®åºæä½åºåï¼ è¿äºæä½è¦ä¹å ¨åè¦ä¹å ¨ä¸åï¼ æ¯ä¸ä¸ªä¸å¯åå²çå·¥ä½åä½ã äºå¡åæ»æ¯æå°è¯¥äºå¡å·²ç»å®æçå¯¹æ°æ®åºçæ´æ°æä½æ¤éãè¦åæ¶ä¿®æ¹æ°æ®åºä¸ä¸¤ä¸ªä¸å表æ¶ï¼ 妿å®ä»¬ä¸æ¯ä¸ä¸ªäºå¡çè¯ï¼ å½ç¬¬ä¸ä¸ªè¡¨ä¿®æ¹å®ï¼ å¯è½ç¬¬äºä¸ªè¡¨ä¿®æ¹è¿ç¨ä¸åºç°äºå¼å¸¸è没è½ä¿®æ¹ï¼ æ¤æ¶å°±åªæç¬¬äºä¸ªè¡¨ä¾æ§æ¯æªä¿®æ¹ä¹åçç¶æï¼ è第ä¸ä¸ªè¡¨å·²ç»è¢«ä¿®æ¹å®æ¯ãèå½ä½ æå®ä»¬è®¾å®ä¸ºä¸ä¸ªäºå¡çæ¶åï¼ å½ç¬¬ä¸ä¸ªè¡¨ä¿®æ¹å®ï¼ 第äºè¡¨ä¿®æ¹åºç°å¼å¸¸è没è½ä¿®æ¹ï¼ 第ä¸ä¸ªè¡¨å第äºä¸ªè¡¨é½è¦åå°æªä¿®æ¹çç¶æï¼ è¿å°±æ¯æè°çäºå¡åæ» ### å¹¶åäºå¡å¸¦æ¥åªäºé®é¢? å¨å ¸åçåºç¨ç¨åºä¸ï¼å¤ä¸ªäºå¡å¹¶åè¿è¡ï¼ç»å¸¸ä¼æä½ç¸åçæ°æ®æ¥å®æåèªçä»»å¡ï¼å¤ä¸ªç¨æ·å¯¹å䏿°æ®è¿è¡æä½ï¼ãå¹¶åè½ç¶æ¯å¿ é¡»çï¼ä½å¯è½ä¼å¯¼è´ä»¥ä¸çé®é¢ã - **è读ï¼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çäºå¡é离级å«äºè§£å? MySQLçåç§é离级å«å¦ä¸: - æªæäº¤è¯»(READ UNCOMMITTED) è¿ä¸ªé离级å«ä¸,å ¶ä»äºå¡å¯ä»¥çå°æ¬äºå¡æ²¡ææäº¤çé¨åä¿®æ¹.å æ¤ä¼é æè读çé®é¢(读åå°äºå ¶ä»äºå¡æªæäº¤çé¨å,èä¹å该äºå¡è¿è¡äºåæ»). è¿ä¸ªçº§å«çæ§è½æ²¡æè¶³å¤å¤§çä¼å¿,使¯åæå¾å¤çé®é¢,å æ¤å¾å°ä½¿ç¨. - å·²æäº¤è¯»(READ COMMITTED) å ¶ä»äºå¡åªè½è¯»åå°æ¬äºå¡å·²ç»æäº¤çé¨å.è¿ä¸ªéç¦»çº§å«æ ä¸å¯éå¤è¯»çé®é¢,å¨åä¸ä¸ªäºå¡å ç两次读å,æ¿å°çç»æç«ç¶ä¸ä¸æ ·,å 为å¦å¤ä¸ä¸ªäºå¡å¯¹æ°æ®è¿è¡äºä¿®æ¹. - REPEATABLE READ(å¯éå¤è¯») å¯éå¤è¯»é离级å«è§£å³äºä¸é¢ä¸å¯éå¤è¯»çé®é¢(çååä¹ç¥é),使¯ä»ç¶æä¸ä¸ªæ°é®é¢,å°±æ¯ å¹»è¯»,å½ä½ 读åid> 10 çæ°æ®è¡æ¶,对æ¶åå°çææè¡å ä¸äºè¯»é,æ¤æ¶ä¾å¤ä¸ä¸ªäºå¡æ°æå ¥äºä¸æ¡id=11çæ°æ®,å ä¸ºæ¯æ°æå ¥ç,æä»¥ä¸ä¼è§¦åä¸é¢çéçææ¥,é£ä¹è¿è¡æ¬äºå¡è¿è¡ä¸ä¸æ¬¡çæ¥è¯¢æ¶ä¼åç°æä¸æ¡id=11çæ°æ®,è䏿¬¡çæ¥è¯¢æä½å¹¶æ²¡æè·åå°,åè¿è¡æå ¥å°±ä¼æä¸»é®å²çªçé®é¢. - SERIALIZABLE(å¯ä¸²è¡å) è¿æ¯æé«çé离级å«,å¯ä»¥è§£å³ä¸é¢æå°çææé®é¢,å 为ä»å¼ºå¶å°æä»¥çæä½ä¸²è¡æ§è¡,è¿ä¼å¯¼è´å¹¶åæ§è½æéä¸é,å æ¤ä¹ä¸æ¯å¾å¸¸ç¨. ### Innodb使ç¨çæ¯åªç§é离级å«å¢? InnoDBé»è®¤ä½¿ç¨çæ¯å¯éå¤è¯»é离级å«. ### MySQL 䏿åªå ç§éï¼ **1ã表级éï¼** å¼éå°ï¼ å éå¿«ï¼ ä¸ä¼åºç°æ»éï¼ éå®ç²åº¦å¤§ï¼ åçéå²çªçæ¦çæé«ï¼ å¹¶å度æä½ã **2ãè¡çº§éï¼** å¼éå¤§ï¼ å éæ ¢ï¼ ä¼åºç°æ»éï¼ éå®ç²åº¦æå°ï¼ åçéå²çªçæ¦çæä½ï¼ å¹¶ååº¦ä¹æé«ã **3ã页é¢éï¼** å¼éåå éæ¶é´çäºè¡¨éåè¡éä¹é´ï¼ ä¼åºç°æ»éï¼ éå®ç²åº¦çäºè¡¨éåè¡éä¹é´ï¼ å¹¶å度ä¸è¬ã ### 对MySQLçéäºè§£å? 彿°æ®åºæå¹¶åäºå¡çæ¶å,å¯è½ä¼äº§çæ°æ®çä¸ä¸è´,è¿æ¶åéè¦ä¸äºæºå¶æ¥ä¿è¯è®¿é®ç次åº,éæºå¶å°±æ¯è¿æ ·çä¸ä¸ªæºå¶. å°±åé åºçæ¿é´,妿大家éæè¿åº,å°±ä¼åºç°å¤äººæ¢å¤ºåä¸ä¸ªæ¿é´çæ åµ,è卿¿é´ä¸è£ ä¸é,ç³è¯·å°é¥åç人æå¯ä»¥å ¥ä½å¹¶ä¸å°æ¿é´éèµ·æ¥,å ¶ä»äººåªæçä»ä½¿ç¨å®æ¯æå¯ä»¥å次使ç¨. ### éæºå¶ä¸InnoDBéç®æ³ **MyISAMåInnoDBåå¨å¼æä½¿ç¨çéï¼** - MyISAMéç¨è¡¨çº§é(table-level locking)ã - InnoDBæ¯æè¡çº§é(row-level locking)å表级é,é»è®¤ä¸ºè¡çº§é **表级éåè¡çº§é对æ¯ï¼** - **表级éï¼** MySQLä¸éå® **ç²åº¦æå¤§** çä¸ç§éï¼å¯¹å½åæä½çæ´å¼ 表å éï¼å®ç°ç®åï¼èµæºæ¶è乿¯è¾å°ï¼å éå¿«ï¼ä¸ä¼åºç°æ»éãå ¶éå®ç²åº¦æå¤§ï¼è§¦åéå²çªçæ¦çæé«ï¼å¹¶å度æä½ï¼MyISAMå InnoDB弿齿¯æè¡¨çº§éã - **è¡çº§éï¼** MySQLä¸éå® **ç²åº¦æå°** çä¸ç§éï¼åªé对å½åæä½çè¡è¿è¡å éã è¡çº§éè½å¤§å¤§åå°æ°æ®åºæä½çå²çªãå ¶å éç²åº¦æå°ï¼å¹¶å度é«ï¼ä½å éçå¼é乿大ï¼å éæ ¢ï¼ä¼åºç°æ»éã **InnoDBåå¨å¼æçéçç®æ³æä¸ç§ï¼** - Record lockï¼å个è¡è®°å½ä¸çé - Gap lockï¼é´ééï¼éå®ä¸ä¸ªèå´ï¼ä¸å æ¬è®°å½æ¬èº« - Next-key lockï¼record+gap éå®ä¸ä¸ªèå´ï¼å å«è®°å½æ¬èº« ### MySQL齿åªäºéå¢?åä¸é¢é£æ ·åè¿è¡éå®å²ä¸æ¯æç¹é»ç¢å¹¶åæçäº? ä»éçç±»å«ä¸æ¥è®²,æå ±äº«éåæä»é. **å ±äº«é:** åå«å读é. å½ç¨æ·è¦è¿è¡æ°æ®çè¯»åæ¶,å¯¹æ°æ®å ä¸å ±äº«é.å ±äº«éå¯ä»¥åæ¶å ä¸å¤ä¸ª. **æä»é:** åå«ååé. å½ç¨æ·è¦è¿è¡æ°æ®çåå ¥æ¶,å¯¹æ°æ®å 䏿ä»é.æä»éåªå¯ä»¥å ä¸ä¸ª,ä»åå ¶ä»çæä»é,å ±äº«éé½ç¸æ¥. ç¨ä¸é¢çä¾åæ¥è¯´å°±æ¯ç¨æ·çè¡ä¸ºæä¸¤ç§,ä¸ç§æ¯æ¥çæ¿,å¤ä¸ªç¨æ·ä¸èµ·çæ¿æ¯å¯ä»¥æ¥åç. ä¸ç§æ¯çæ£çå ¥ä½ä¸æ,å¨è¿æé´,æ è®ºæ¯æ³å ¥ä½çè¿æ¯æ³çæ¿çé½ä¸å¯ä»¥. éçç²åº¦åå³äºå ·ä½çåå¨å¼æ,InnoDBå®ç°äºè¡çº§é,页级é,表级é. ä»ä»¬çå éå¼éä»å¤§å¤§å°,å¹¶åè½å乿¯ä»å¤§å°å°. ### éçä¼åçç¥ **1ã** 读åå离 **2ã** åæ®µå é **3ã** åå°éææçæ¶é´ å¤ä¸ªçº¿ç¨å°½é以ç¸åç顺åºå»è·åèµæº ä¸è½å°éçç²åº¦è¿äºç»åï¼ ä¸ç¶å¯è½ä¼åºç°çº¿ç¨çå éåéæ¾æ¬¡æ°è¿å¤ï¼ åèæçä¸å¦ä¸æ¬¡å 䏿大éã ### Explain æ§è½åæ **æ¯ä»ä¹** æ¥çæ§è¡è®¡åï¼ä½¿ç¨ EXPLAIN å ³é®åå¯ä»¥æ¨¡æä¼å卿§è¡ SQL æ¥è¯¢è¯å¥ï¼ä»èç¥é MySQL æ¯å¦ä½å¤ç SQL è¯å¥çãåææ¥è¯¢è¯å¥ææ¯è¡¨ç»æçæ§è½ç¶é¢ã **è½å¹²å** - 表ç读åé¡ºåº - æ°æ®è¯»åæä½çæä½ç±»å - åªäºç´¢å¼å¯ä»¥ä½¿ç¨ - åªäºç´¢å¼è¢«å®é ä½¿ç¨ - 表ä¹é´çå¼ç¨ - æ¯å¼ 表æå¤å°è¡è¢«ä¼å卿¥è¯¢ **æä¹ç©** Explain + SQL è¯å¥ã Explain æ§è¡åè¿åçä¿¡æ¯ï¼  **ååæ®µè§£é** 1. idï¼select æ¥è¯¢çåºåå·ï¼å å«ä¸ç»æ°åï¼è¡¨ç¤ºæ¥è¯¢ä¸æ§è¡ select å奿æä½è¡¨ç顺åºã - id ç¸åï¼æ§è¡é¡ºåºç±ä¸è³ä¸ - id ä¸åï¼å¦ææ¯åæ¥è¯¢ï¼id çåºå·ä¼éå¢ï¼id å¼è¶å¤§ä¼å 级è¶é«ï¼è¶å 被æ§è¡ - id æç¸å乿ä¸åï¼id 妿ç¸åï¼å¯ä»¥è®¤ä¸ºæ¯ä¸ç»ï¼ä»ä¸å¾ä¸é¡ºåºæ§è¡ï¼å¨ææç»ä¸ï¼id å¼è¶å¤§ï¼ä¼å 级è¶é«ï¼è¶å æ§è¡ > id å·æ¯ä¸ªå·ç ï¼è¡¨ç¤ºä¸è¶ç¬ç«çæ¥è¯¢ãä¸ä¸ª sql çæ¥è¯¢è¶æ°è¶å°è¶å¥½ã 2. select_typeï¼ä»£è¡¨æ¥è¯¢çç±»åï¼ä¸»è¦æ¯ç¨äºåºå«æ®éæ¥è¯¢ãèåæ¥è¯¢ãåæ¥è¯¢çç夿æ¥è¯¢ï¼åå¼èå´å¦ä¸ï¼ - simpleï¼ç®åç select æ¥è¯¢ï¼æ¥è¯¢ä¸ä¸å å«åæ¥è¯¢æè UNION - primaryï¼æ¥è¯¢ä¸è¥å å«ä»»ä½å¤æçåé¨åï¼æå¤å±æ¥è¯¢å被æ 记为 primary - derivedï¼å¨ FROM å表ä¸å å«çåæ¥è¯¢è¢«æ 记为 DERIVED (è¡ç)ï¼MySQL ä¼é彿§è¡è¿äºåæ¥è¯¢, æç»ææ¾å¨ä¸´æ¶è¡¨éã - subqueryï¼å¨ SELECT æ WHERE å表ä¸å å«äºåæ¥è¯¢ - depedent subqueryï¼å¨ SELECT æ WHERE å表ä¸å å«äºåæ¥è¯¢ï¼åæ¥è¯¢åºäºå¤å± - uncacheable subqueryï¼æ æ³ä½¿ç¨ç¼åçåæ¥è¯¢ - unionï¼è¥ç¬¬äºä¸ª SELECT åºç°å¨ UNION ä¹åï¼å被æ 记为 UNIONï¼è¥ UNION å å«å¨ FROM åå¥çåæ¥è¯¢ä¸ï¼å¤å± SELECT å°è¢«æ 记为ï¼DERIVED - union resultï¼ä» UNION 表è·åç»æç SELECT 3. tableï¼è¿ä¸ªæ°æ®æ¯åºäºåªå¼ 表çã 4. typeï¼æ¯æ¥è¯¢ç访é®ç±»åãæ¯è¾ä¸ºéè¦çä¸ä¸ªææ ï¼ç»æå¼ä»æå¥½å°æå便¬¡æ¯ï¼system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALLï¼ä¸è¬æ¥è¯´ï¼å¾ä¿è¯æ¥è¯¢è³å°è¾¾å° range 级å«ï¼æå¥½è½è¾¾å° refã > åªéè¦è®°ä½ï¼system > const > eq_ref > ref > range > index > ALL å°±è¡äºï¼å ¶ä»çä¸å¸¸è§ã - systemï¼è¡¨åªæä¸è¡è®°å½ï¼çäºç³»ç»è¡¨ï¼ï¼è¿æ¯ const ç±»åçç¹åï¼å¹³æ¶ä¸ä¼åºç°ï¼è¿ä¸ªä¹å¯ä»¥å¿½ç¥ä¸è®¡ã - constï¼è¡¨ç¤ºéè¿ç´¢å¼ä¸æ¬¡å°±æ¾å°äºï¼const ç¨äºæ¯è¾ primary key æè unique ç´¢å¼ãå 为åªå¹é ä¸è¡æ°æ®ï¼æä»¥å¾å¿«ãå¦å°ä¸»é®ç½®äº where å表ä¸ï¼MySQL å°±è½å°è¯¥æ¥è¯¢è½¬æ¢ä¸ºä¸ä¸ªå¸¸éã - eq_refï¼å¯ä¸æ§ç´¢å¼æ«æï¼å¯¹äºæ¯ä¸ªç´¢å¼é®ï¼è¡¨ä¸åªæä¸æ¡è®°å½ä¸ä¹å¹é ã常è§äºä¸»é®æå¯ä¸ç´¢å¼æ«æã - refï¼éå¯ä¸æ§ç´¢å¼æ«æï¼è¿åå¹é æä¸ªåç¬å¼çææè¡ãæ¬è´¨ä¸ä¹æ¯ä¸ç§ç´¢å¼è®¿é®ï¼å®è¿åææå¹é æä¸ªåç¬å¼çè¡ï¼ç¶èï¼å®å¯è½ä¼æ¾å°å¤ä¸ªç¬¦åæ¡ä»¶çè¡ï¼æä»¥ä»åºè¯¥å±äºæ¥æ¾åæ«æçæ··åä½ã - rangeï¼åªæ£ç´¢ç»å®èå´çè¡ï¼ä½¿ç¨ä¸ä¸ªç´¢å¼æ¥éæ©è¡ãkey åæ¾ç¤ºä½¿ç¨äºåªä¸ªç´¢å¼ä¸è¬å°±æ¯å¨ where è¯å¥ä¸åºç°äº betweenã<ã>ãin ççæ¥è¯¢è¿ç§èå´æ«æç´¢å¼æ«ææ¯å ¨è¡¨æ«æè¦å¥½ï¼å 为å®åªéè¦å¼å§äºç´¢å¼çæä¸ç¹ï¼èç»æè¯å¦ä¸ç¹ï¼ä¸ç¨æ«æå ¨é¨ç´¢å¼ã - indexï¼åºç° index æ¯ sql 使ç¨äºç´¢å¼ä½æ¯æ²¡ç¨ç´¢å¼è¿è¡è¿æ»¤ï¼ä¸è¬æ¯ä½¿ç¨äºè¦çç´¢å¼æè æ¯å©ç¨ç´¢å¼è¿è¡äºæåºåç»ã - allï¼å°éåå ¨è¡¨ä»¥æ¾å°å¹é çè¡ã > å ¶ä» type å¦ä¸ï¼ - index_mergeï¼å¨æ¥è¯¢è¿ç¨ä¸éè¦å¤ä¸ªç´¢å¼ç»å使ç¨ï¼é常åºç°å¨æ or å ³é®åç sql ä¸ã - ref_or_nullï¼å¯¹äºæä¸ªå段æ¢éè¦è¿æ»¤æ¡ä»¶ï¼ä¹éè¦ null å¼çæ åµä¸ãæ¥è¯¢ä¼åå¨ä¼éæ©ç¨ ref_or_null è¿æ¥æ¥è¯¢ã - index_subqueryï¼å©ç¨ç´¢å¼æ¥å ³èåæ¥è¯¢ï¼ä¸åå ¨è¡¨æ«æã - unique_subqueryï¼è¯¥èæ¥ç±»åç±»ä¼¼äº index_subqueryãåæ¥è¯¢ä¸çå¯ä¸ç´¢å¼ã 5. possible_keysï¼æ¾ç¤ºå¯è½åºç¨å¨è¿å¼ 表ä¸çç´¢å¼ï¼ä¸ä¸ªæå¤ä¸ªãæ¥è¯¢æ¶åå°çåæ®µä¸è¥åå¨ç´¢å¼ï¼å该索å¼å°è¢«ååºï¼ä½ä¸ä¸å®è¢«æ¥è¯¢å®é 使ç¨ã 6. keyï¼å®é 使ç¨çç´¢å¼ãå¦æä¸º NULLï¼å没æä½¿ç¨ç´¢å¼ã 7. key_lenï¼è¡¨ç¤ºç´¢å¼ä¸ä½¿ç¨çåèæ°ï¼å¯éè¿è¯¥åè®¡ç®æ¥è¯¢ä¸ä½¿ç¨çç´¢å¼çé¿åº¦ãkey_len æ¾ç¤ºçå¼ä¸ºç´¢å¼å段çæå¤§å¯è½é¿åº¦ï¼å¹¶éå®é 使ç¨é¿åº¦ãå¦ä½è®¡ç® key_lenï¼ - å çç´¢å¼ä¸å段çç±»å + é¿åº¦ï¼æ¯å¦ï¼int=4; varchar(20)=20; char(20)=20 - å¦ææ¯ varchar æè char è¿ç§åç¬¦ä¸²åæ®µï¼è§å符éè¦ä¹ä¸åçå¼ï¼æ¯å¦ utf-8 è¦ä¹ 3ï¼GBK è¦ä¹ 2 - varchar è¿ç§å¨æå符串è¦å 2 个åè - å 许为空çåæ®µè¦å 1 个åè 8. refï¼æ¾ç¤ºç´¢å¼çåªä¸å被使ç¨äºï¼å¦æå¯è½çè¯ï¼æ¯ä¸ä¸ªå¸¸æ°ãåªäºåæå¸¸é被ç¨äºæ¥æ¾ç´¢å¼åä¸çå¼ã 9. rowsï¼æ¾ç¤º MySQL è®¤ä¸ºå®æ§è¡æ¥è¯¢æ¶å¿ é¡»æ£æ¥çè¡æ°ãè¶å°è¶å¥½ï¼ 10. Extraï¼å ¶ä»çé¢å¤éè¦çä¿¡æ¯ã - Using filesortï¼è¯´æ mysql ä¼å¯¹æ°æ®ä½¿ç¨ä¸ä¸ªå¤é¨çç´¢å¼æåºï¼è䏿¯æç §è¡¨å çç´¢å¼é¡ºåºè¿è¡è¯»åãMySQL 䏿 æ³å©ç¨ç´¢å¼å®æçæåºæä½ç§°ä¸ºâæä»¶æåºâã**æåºå段è¥éè¿ç´¢å¼å»è®¿é®å°å¤§å¤§æé«æåºé度**ã - Using temporaryï¼ä½¿ç¨ä¸´æ¶è¡¨ä¿åä¸é´ç»æï¼MySQL å¨å¯¹æ¥è¯¢ç»ææåºæ¶ä½¿ç¨ä¸´æ¶è¡¨ã常è§äºæåº order by ååç»æ¥è¯¢ group byã - Using indexï¼è¡¨ç¤ºç¸åºç select æä½ä¸ä½¿ç¨äºè¦çç´¢å¼ (Covering Index)ï¼é¿å 访é®äºè¡¨çæ°æ®è¡ï¼æçä¸éï¼å¦æåæ¶åºç° using whereï¼è¡¨æç´¢å¼è¢«ç¨æ¥æ§è¡ç´¢å¼é®å¼çæ¥æ¾ï¼å¦ææ²¡æåæ¶åºç° using whereï¼è¡¨æç´¢å¼åªæ¯ç¨æ¥è¯»åæ°æ®èéå©ç¨ç´¢å¼æ§è¡æ¥æ¾ã - Using whereï¼è¡¨æä½¿ç¨äº where è¿æ»¤ã - Using join bufferï¼ä½¿ç¨äºè¿æ¥ç¼åã - impossible whereï¼where åå¥ç弿»æ¯ falseï¼ä¸è½ç¨æ¥è·å任使°æ®ã - select tables optimized awayï¼å¨æ²¡æ group by åå¥çæ åµä¸ï¼åºäºç´¢å¼ä¼å MIN/MAX æä½æè å¯¹äº MyISAM åå¨å¼æä¼å COUNT(*) æä½ï¼ä¸å¿ çå°æ§è¡é¶æ®µåè¿è¡è®¡ç®ï¼æ¥è¯¢æ§è¡è®¡åçæçé¶æ®µå³å®æä¼åã - distinctï¼ä¼å distinct æä½ï¼å¨æ¾å°ç¬¬ä¸å¹é çå ç¥åå³åæ¢æ¾åæ ·å¼çå¨ä½ã ### å¦ä½ä¼åSQL **1ãSQLè¯å¥ä¸INå å«çå¼ä¸åºè¿å¤** MySQL对äºINåäºç¸åºçä¼åï¼å³å°INä¸ç常éå ¨é¨åå¨å¨ä¸ä¸ªæ°ç»éé¢ï¼èä¸è¿ä¸ªæ°ç»æ¯æå¥½åºçã使¯å¦ææ°å¼è¾å¤ï¼äº§ççæ¶è乿¯æ¯è¾å¤§çãåä¾å¦ï¼`select id from table_name where num in(1,2,3)` 对äºè¿ç»çæ°å¼ï¼è½ç¨ between å°±ä¸è¦ç¨ in äºï¼åæè 使ç¨è¿æ¥æ¥æ¿æ¢ã **2ãSELECTè¯å¥å¡å¿ ææå段åç§°** SELECT *å¢å å¾å¤ä¸å¿ è¦çæ¶èï¼cpuãioãå åãç½ç»å¸¦å®½ï¼ï¼å¢å äºä½¿ç¨è¦çç´¢å¼çå¯è½æ§ï¼å½è¡¨ç»æåçæ¹åæ¶ï¼åæä¹éè¦æ´æ°ãæä»¥è¦æ±ç´æ¥å¨selectå颿¥ä¸å段åã **3ãå½åªéè¦ä¸æ¡æ°æ®çæ¶åï¼ä½¿ç¨limit 1** è¿æ¯ä¸ºäºä½¿EXPLAINä¸typeåè¾¾å°constç±»å **4ã妿æåºå段没æç¨å°ç´¢å¼ï¼å°±å°½éå°æåº** **5ã妿éå¶æ¡ä»¶ä¸å ¶ä»å段没æç´¢å¼ï¼å°½éå°ç¨or** or两边çåæ®µä¸ï¼å¦ææä¸ä¸ªä¸æ¯ç´¢å¼å段ï¼èå ¶ä»æ¡ä»¶ä¹ä¸æ¯ç´¢å¼å段ï¼ä¼é æè¯¥æ¥è¯¢ä¸èµ°ç´¢å¼çæ åµãå¾å¤æ¶åä½¿ç¨ union all æè æ¯union(å¿ è¦çæ¶å)çæ¹å¼æ¥ä»£æ¿âorâä¼å¾å°æ´å¥½çææ **6ãå°½éç¨union all代æ¿union** unionåunion allçå·®å¼ä¸»è¦æ¯åè éè¦å°ç»æéåå¹¶ååè¿è¡å¯ä¸æ§è¿æ»¤æä½ï¼è¿å°±ä¼æ¶åå°æåºï¼å¢å 大éçCPUè¿ç®ï¼å å¤§èµæºæ¶èåå»¶è¿ã**å½ç¶ï¼union allçåææ¡ä»¶æ¯ä¸¤ä¸ªç»æé没æé夿°æ®ã** **7ãä¸ä½¿ç¨ORDER BY RAND()** ```sql select id from `table_name` order by rand() limit 1000; ``` ä¸é¢çsqlè¯å¥ï¼å¯ä¼å为 ```sql select id from `table_name` t1 join (select rand() * (select max(id) from `table_name`) as nid) t2 ont1.id > t2.nid limit 1000; ``` **8ãåºåinåexistsï¼ not inånot exists** ```sql select * from 表A where id in (select id from 表B) ``` ä¸é¢sqlè¯å¥ç¸å½äº ```sql select * from 表A where exists(select * from 表B where 表B.id=表A.id) ``` åºåinåexistsä¸»è¦æ¯é æäºé©±å¨é¡ºåºçæ¹åï¼è¿æ¯æ§è½ååçå ³é®ï¼ï¼å¦ææ¯existsï¼é£ä¹ä»¥å¤å±è¡¨ä¸ºé©±å¨è¡¨ï¼å 被访é®ï¼å¦ææ¯INï¼é£ä¹å æ§è¡åæ¥è¯¢ãæä»¥**INéåäºå¤è¡¨å¤§èå 表å°çæ åµï¼EXISTSéåäºå¤è¡¨å°èå è¡¨å¤§çæ åµã** å ³äºnot inånot existsï¼æ¨è使ç¨not existsï¼ä¸ä» ä» æ¯æçé®é¢ï¼not inå¯è½åå¨é»è¾é®é¢ã**å¦ä½é«æçååºä¸ä¸ªæ¿ä»£not existsçsqlè¯å¥ï¼** åsqlè¯å¥ ```sql select colname ⦠from A表 where a.id not in (select b.id from B表) ``` 髿çsqlè¯å¥ ```csharp select colname ⦠from A表 Left join B表 on where a.id = b.id where b.id is null ``` ååºçç»æéå¦ä¸å¾è¡¨ç¤ºï¼A表ä¸å¨B表ä¸çæ°æ®  **9ã使ç¨åççå页æ¹å¼ä»¥æé«å页çæç** ```sql select id,name from table_name limit 866613, 20 ``` 使ç¨ä¸è¿°sqlè¯å¥ååé¡µçæ¶åï¼å¯è½æäººä¼åç°ï¼éçè¡¨æ°æ®éçå¢å ï¼ç´æ¥ä½¿ç¨limitå页æ¥è¯¢ä¼è¶æ¥è¶æ ¢ã ä¼åçæ¹æ³å¦ä¸ï¼å¯ä»¥ååä¸é¡µçæå¤§è¡æ°çidï¼ç¶åæ ¹æ®è¿ä¸ªæå¤§çidæ¥éå¶ä¸ä¸é¡µçèµ·ç¹ãæ¯å¦æ¤åä¸ï¼ä¸ä¸é¡µæå¤§çidæ¯866612ãsqlå¯ä»¥éç¨å¦ä¸çåæ³ï¼ ```csharp select id,name from table_name where id> 866612 limit 20 ``` **10ãåæ®µæ¥è¯¢** å¨ä¸äºç¨æ·éæ©é¡µé¢ä¸ï¼å¯è½ä¸äºç¨æ·éæ©çæ¶é´èå´è¿å¤§ï¼é ææ¥è¯¢ç¼æ ¢ã主è¦çåå æ¯æ«æè¡æ°è¿å¤ãè¿ä¸ªæ¶åå¯ä»¥éè¿ç¨åºï¼å段è¿è¡æ¥è¯¢ï¼å¾ªç¯éåï¼å°ç»æåå¹¶å¤çè¿è¡å±ç¤ºã å¦ä¸å¾è¿ä¸ªsqlè¯å¥ï¼æ«æçè¡æ°æç¾ä¸çº§ä»¥ä¸çæ¶åå°±å¯ä»¥ä½¿ç¨å段æ¥è¯¢  **11ãé¿å å¨ where åå¥ä¸å¯¹å段è¿è¡ null å¼å¤æ** 对äºnullç夿ä¼å¯¼è´å¼ææ¾å¼ä½¿ç¨ç´¢å¼èè¿è¡å ¨è¡¨æ«æã **12ãä¸å»ºè®®ä½¿ç¨%åç¼æ¨¡ç³æ¥è¯¢** ä¾å¦LIKE â%nameâæè LIKE â%name%âï¼è¿ç§æ¥è¯¢ä¼å¯¼è´ç´¢å¼å¤±æèè¿è¡å ¨è¡¨æ«æã使¯å¯ä»¥ä½¿ç¨LIKE âname%âã **é£å¦ä½æ¥è¯¢%name%ï¼** å¦ä¸å¾æç¤ºï¼è½ç¶ç»secretåæ®µæ·»å äºç´¢å¼ï¼ä½å¨explainç»ææå¹¶æ²¡æä½¿ç¨  é£ä¹å¦ä½è§£å³è¿ä¸ªé®é¢å¢ï¼çæ¡ï¼**使ç¨å ¨æç´¢å¼** 卿们æ¥è¯¢ä¸ç»å¸¸ä¼ç¨å°select id,fnum,fdst from table_name where user_name like '%zhangsan%'; ãè¿æ ·çè¯å¥ï¼æ®éç´¢å¼æ¯æ æ³æ»¡è¶³æ¥è¯¢éæ±çãåºå¹¸çæ¯å¨MySQLä¸ï¼æå ¨æç´¢å¼æ¥å¸®å©æä»¬ã åå»ºå ¨æç´¢å¼çsqlè¯æ³æ¯ï¼ ```go ALTER TABLE `table_name` ADD FULLTEXT INDEX `idx_user_name` (`user_name`); ``` 使ç¨å ¨æç´¢å¼çsqlè¯å¥æ¯ï¼ ```csharp select id,fnum,fdst from table_name where match(user_name) against('zhangsan' in boolean mode); ``` **注æï¼å¨éè¦åå»ºå ¨æç´¢å¼ä¹åï¼è¯·èç³»DBAç¡®å®è½å¦å建ãåæ¶éè¦æ³¨æçæ¯æ¥è¯¢è¯å¥ç忳䏿®éç´¢å¼çåºå«** **13ãé¿å å¨whereåå¥ä¸å¯¹å段è¿è¡è¡¨è¾¾å¼æä½** æ¯å¦ ```csharp select user_id,user_project from table_name where age*2=36; ``` ä¸å¯¹å段就è¡äºç®æ¯è¿ç®ï¼è¿ä¼é æå¼ææ¾å¼ä½¿ç¨ç´¢å¼ï¼å»ºè®®æ¹æ ```csharp select user_id,user_project from table_name where age=36/2; ``` **14ãé¿å éå¼ç±»å转æ¢** where åå¥ä¸åºç° column åæ®µçç±»ååä¼ å ¥çåæ°ç±»åä¸ä¸è´çæ¶ååççç±»å转æ¢ï¼å»ºè®®å ç¡®å®whereä¸çåæ°ç±»å  **15ã对äºèåç´¢å¼æ¥è¯´ï¼è¦éµå®æå·¦åç¼æ³å** ä¸¾åæ¥è¯´ç´¢å¼å«æå段id,name,schoolï¼å¯ä»¥ç´æ¥ç¨idåæ®µï¼ä¹å¯ä»¥id,nameè¿æ ·ç顺åºï¼ä½æ¯name;school齿 æ³ä½¿ç¨è¿ä¸ªç´¢å¼ãæä»¥å¨å建èåç´¢å¼çæ¶åä¸å®è¦æ³¨æç´¢å¼å段顺åºï¼å¸¸ç¨çæ¥è¯¢å段æ¾å¨æåé¢ **16ãå¿ è¦æ¶å¯ä»¥ä½¿ç¨force indexæ¥å¼ºå¶æ¥è¯¢èµ°æä¸ªç´¢å¼** æçæ¶åMySQLä¼åå¨éåå®è®¤ä¸ºåéçç´¢å¼æ¥æ£ç´¢sqlè¯å¥ï¼ä½æ¯å¯è½å®æéç¨çç´¢å¼å¹¶ä¸æ¯æä»¬æ³è¦çãè¿æ¶å°±å¯ä»¥éç¨force indexæ¥å¼ºå¶ä¼åå¨ä½¿ç¨æä»¬å¶å®çç´¢å¼ã **17ãæ³¨æèå´æ¥è¯¢è¯å¥** 对äºèåç´¢å¼æ¥è¯´ï¼å¦æåå¨èå´æ¥è¯¢ï¼æ¯å¦between,>,<çæ¡ä»¶æ¶ï¼ä¼é æåé¢çç´¢å¼å段失æã **18ãå ³äºJOINä¼å**  - LEFT JOIN A表为驱å¨è¡¨ - INNER JOIN MySQLä¼èªå¨æ¾åºé£ä¸ªæ°æ®å°ç表ä½ç¨é©±å¨è¡¨ - RIGHT JOIN B表为驱å¨è¡¨ **注æï¼MySQL䏿²¡æfull joinï¼å¯ä»¥ç¨ä»¥ä¸æ¹å¼æ¥è§£å³** ```csharp select * from A left join B on B.name = A.name where B.name is null union all select * from B; ``` **å°½é使ç¨inner joinï¼é¿å left join** åä¸èåæ¥è¯¢ç表è³å°ä¸º2å¼ è¡¨ï¼ä¸è¬é½åå¨å¤§å°ä¹åãå¦æè¿æ¥æ¹å¼æ¯inner joinï¼å¨æ²¡æå ¶ä»è¿æ»¤æ¡ä»¶çæ åµä¸MySQLä¼èªå¨éæ©å°è¡¨ä½ä¸ºé©±å¨è¡¨ï¼ä½æ¯left joinå¨é©±å¨è¡¨çéæ©ä¸éµå¾ªçæ¯å·¦è¾¹é©±å¨å³è¾¹çååï¼å³left join左边ç表å为驱å¨è¡¨ã **åçå©ç¨ç´¢å¼** 被驱å¨è¡¨çç´¢å¼å段ä½ä¸ºonçéå¶å段ã **å©ç¨å°è¡¨å»é©±å¨å¤§è¡¨**  ä»åçå¾è½å¤ç´è§ççåºå¦æè½å¤åå°é©±å¨è¡¨çè¯ï¼åå°åµå¥å¾ªç¯ä¸çå¾ªç¯æ¬¡æ°ï¼ä»¥åå° IOæ»éåCPUè¿ç®ç次æ°ã **å·§ç¨STRAIGHT_JOIN** inner joinæ¯ç±mysql鿩驱å¨è¡¨ï¼ä½æ¯æäºç¹æ®æ åµéè¦éæ©å¦ä¸ªè¡¨ä½ä¸ºé©±å¨è¡¨ï¼æ¯å¦ægroup byãorder byçãUsing filesortãããUsing temporaryãæ¶ãSTRAIGHT_JOINæ¥å¼ºå¶è¿æ¥é¡ºåºï¼å¨STRAIGHT_JOIN左边ç表åå°±æ¯é©±å¨è¡¨ï¼å³è¾¹åæ¯è¢«é©±å¨è¡¨ã**å¨ä½¿ç¨STRAIGHT_JOINæä¸ªåææ¡ä»¶æ¯è¯¥æ¥è¯¢æ¯å è¿æ¥ï¼ä¹å°±æ¯inner joinãå ¶ä»é¾æ¥ä¸æ¨è使ç¨STRAIGHT_JOINï¼å¦åå¯è½é ææ¥è¯¢ç»æä¸åç¡®ã**  è¿ä¸ªæ¹å¼ææ¶å¯è½åå°3åçæ¶é´ã