在烦(ch¨³)引列上,除了(ji¨£n)ä¸Šé¢æåˆ°çš„æœ‰åºæŸ¥æ‰¾ä¹‹å¤–,数æ®åº“利用儿U儿 ïL(f¨¥ng)š„å¿«é€Ÿå®šä½æŠ€æœ¯ï¼Œèƒ½å¤Ÿå¤§å¤§æé«˜æŸ¥è¯¢æ•ˆçŽ‡ã€‚ç‰¹åˆ«æ˜¯å½“æ•°æ®é‡éžå¸¸å¤§ï¼ŒæŸ¥è¯¢æ¶‰åŠ(qi¨¢ng)多个表时åQŒä‹É用烦(ch¨³)引往往能ä‹ÉæŸ¥è¯¢é€Ÿåº¦åŠ å¿«æˆåƒä¸Šä¸‡å€ã€?/span>
例如åQŒæœ‰3个未索引的表t1ã€?/span>t2ã€?/span>t3åQŒåˆ†åˆ«åªåŒ…å«åˆ?/span>c1ã€?/span>c2ã€?/span>c3åQŒæ¯ä¸ªè¡¨åˆ†åˆ«å«æœ‰1000行数æ®ç»„æˆï¼ŒæŒ‡äØ“(f¨´)1ï½?/span>1000的数å€û|¼ŒæŸ¥æ‰¾å¯¹åº”值相½{‰è¡Œçš„æŸ¥è¯¢å¦‚下所½Cºã€?/span>
SELECT c1,c2,c3 FROM t1,t2,t3 WHERE c1=c2 AND c1=c3
æ¤æŸ¥è¯¢ç»“æžœåº”è¯¥äØ“(f¨´)1000行,æ¯è¡ŒåŒ…å«3个相½{‰çš„倹{€‚åœ¨æ— çƒ¦(ch¨³)å¼•çš„æƒ…å†µä¸‹å¤„ç†æ¤æŸ¥è¯¢åQŒå¿…™åÕd¯»æ‰?/span>3个表所有的¾l„åˆåQŒä»¥ä¾¿å¾—å‡ÞZ¸ŽWHEREåå¥ç›”R…的那些行。而å¯èƒ½çš„¾l„åˆæ•°ç›®ä¸?/span>1000×1000×1000åQˆå亿)(j¨ª)åQŒæ˜¾ç„¶æŸ¥è¯¢å°†ä¼?x¨¬)éžå¸¸æ…¢ã€?/span>
如果å¯ÒŽ(gu¨©)¯ä¸ªè¡¨˜q›è¡Œç´¢å¼•åQŒå°±èƒ½æžå¤§åœ°åŠ é€ŸæŸ¥è¯¢è¿›½E‹ã€‚利用烦(ch¨³)引的查询处ç†å¦‚下ã€?/span>
åQ?/span>1åQ‰ä»Žè¡?/span>t1ä¸é€‰æ‹©½W¬ä¸€è¡Œï¼ŒæŸ¥çœ‹æ¤è¡Œæ‰€åŒ…å«çš„æ•°æ®ã€?/span>
åQ?/span>2åQ?span>使用è¡?/span>t2上的索引åQŒç›´æŽ¥å®šä½?/span>t2ä¸ä¸Žt1的值匹é…的行。类ä¼û|¼Œåˆ©ç”¨è¡?/span>t3上的索引åQ?/span>直接定ä½t3ä¸ä¸Žæ¥è‡ªt1的值匹é…的行ã€?/span>
åQ?/span>3åQ‰æ‰«æè¡¨t1çš„ä¸‹ä¸€è¡ŒåÆˆé‡å¤å‰é¢çš„过½E‹ï¼Œç›´åˆ°é历t1䏿‰€æœ‰çš„行ã€?/span>
åœ¨æ¤æƒ…åŞ下,ä»ç„¶å¯¹è¡¨t1执行äº?ji¨£n)一个完全扫æï¼Œä½†èƒ½å¤Ÿåœ¨è¡?/span>t2å’?/span>t3上进行烦(ch¨³)引查扄¡›´æŽ¥å–å‡?gu¨®)™¿™äº›è¡¨ä¸çš„行,比未用çƒ?ch¨³)引时è¦å¿«ä¸€ç™¾ä¸‡å€ã€?/span>
利用索引åQ?/span>MySQLåŠ é€Ÿäº†(ji¨£n)WHEREå奿»¡èƒöæ¡äšg行的æœçƒ¦(ch¨³)åQŒè€Œåœ¨å¤šè¡¨˜qžæŽ¥æŸ¥è¯¢æ—Óž¼Œåœ¨æ‰§è¡Œè¿žæŽ¥æ—¶åŠ å¿«äº?ji¨£n)与其他表ä¸çš„行匚w…的速度ã€?/span>
在执è¡?/span>CREATE TABLEè¯å¥æ—¶å¯ä»¥åˆ›å»ºçƒ¦(ch¨³)引,也å¯ä»¥å•独用CREATE INDEXæˆ?/span>ALTER TABLEæ¥äØ“(f¨´)è¡¨å¢žåŠ çƒ¦(ch¨³)引ã€?/span>
ALTER TABLE用æ¥åˆ›å¾æ™®é€šçƒ¦(ch¨³)引ã€?/span>UNIQUE索引æˆ?/span>PRIMARY KEY索引ã€?/span>
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指出对哪些列˜q›è¡Œç´¢å¼•åQŒå¤šåˆ—æ—¶å„列之间用逗å·åˆ†éš”。烦(ch¨³)引åindex_nameå¯é€‰ï¼Œ¾~ºçœæ—Óž¼ŒMySQLž®†æ ¹æ®ç¬¬ä¸€ä¸ªçƒ¦(ch¨³)引列赋一个å¿U°ã€‚å¦å¤–,ALTER TABLEå…许在å•个è¯å¥ä¸æ›´æ”¹å¤šä¸ªè¡¨ï¼Œå› æ¤å¯ä»¥åœ¨åŒæ—¶åˆ›å»ºå¤šä¸ªçƒ¦(ch¨³)引ã€?/span>
CREATE INDEXå¯å¯¹è¡¨å¢žåŠ æ™®é€šçƒ¦(ch¨³)引或UNIQUE索引ã€?/span>
CREATE INDEX index_name ON table_name (column_list)
CREATE UNIQUE INDEX index_name ON table_name (column_list)
table_nameã€?/span>index_nameå’?/span>column_listå…ähœ‰ä¸?/span>ALTER TABLEè¯å¥ä¸ç›¸åŒçš„å«ä¹‰åQŒçƒ¦(ch¨³)引åä¸å¯é€‰ã€‚å¦å¤–,ä¸èƒ½ç”?/span>CREATE INDEXè¯å¥åˆ›å¾PRIMARY KEY索引ã€?/span>
在创建烦(ch¨³)引时åQŒå¯ä»¥è§„定烦(ch¨³)引能å¦åŒ…å«é‡å¤å€¹{€‚如果ä¸åŒ…å«åQŒåˆ™ç´¢å¼•应该创å¾ä¸?/span>PRIMARY KEYæˆ?/span>UNIQUE索引。对于å•列惟一性烦(ch¨³)引,˜q™ä¿è¯å•列ä¸åŒ…å«é‡å¤çš„倹{€‚对于多列惟一性烦(ch¨³)引,ä¿è¯å¤šä¸ªå€¼çš„¾l„åˆä¸é‡å¤ã€?/span>
PRIMARY KEY索引å’?/span>UNIQUE索引éžå¸¸¾cÖM¼¼ã€‚事实上åQ?/span>PRIMARY KEY索引仅是一个具有å¿U?/span>PRIMARYçš?/span>UNIQUE索引。这表示一个表åªèƒ½åŒ…å«ä¸€ä¸?/span>PRIMARY KEYåQŒå› ä¸ÞZ¸€ä¸ªè¡¨ä¸ä¸å¯èƒ½å…ähœ‰ä¸¤ä¸ªåŒå的烦(ch¨³)引ã€?/span>
下é¢çš?/span>SQLè¯å¥å¯?/span>students表在sid上添åŠ?/span>PRIMARY KEY索引ã€?/span>
ALTER TABLE students ADD PRIMARY KEY (sid)
å¯åˆ©ç”?/span>ALTER TABLEæˆ?/span>DROP INDEXè¯å¥æ¥åˆ 除烦(ch¨³)引。类ä¼égºŽCREATE INDEXè¯å¥åQ?/span>DROP INDEXå¯ä»¥åœ?/span>ALTER TABLEå†…éƒ¨ä½œäØ“(f¨´)一æ¡è¯å¥å¤„ç†ï¼Œè¯æ³•如下ã€?/span>
DROP INDEX index_name ON talbe_name
ALTER TABLE table_name DROP INDEX index_name
ALTER TABLE table_name DROP PRIMARY KEY
å…¶ä¸åQŒå‰ä¸¤æ¡è¯å¥æ˜¯ç‰ä»ïL(f¨¥ng)š„åQŒåˆ 除掉table_nameä¸çš„索引index_nameã€?/span>
½W?/span>3æ¡è¯å¥åªåœ¨åˆ é™?/span>PRIMARY KEY索引时ä‹Éç”¨ï¼Œå› äØ“(f¨´)一个表åªå¯èƒ½æœ‰ä¸€ä¸?/span>PRIMARY KEY索引åQŒå› æ¤ä¸éœ€è¦æŒ‡å®šçƒ¦(ch¨³)引å。如果没有创å»?/span>PRIMARY KEY索引åQŒä½†è¡¨å…·æœ‰ä¸€ä¸ªæˆ–多个UNIQUE索引åQŒåˆ™MySQLž®†åˆ 除第一ä¸?/span>UNIQUE索引ã€?/span>
如果从表ä¸åˆ 除了(ji¨£n)æŸåˆ—åQŒåˆ™ç´¢å¼•ä¼?x¨¬)å—到åª?ji¨£ng)å“。对于多列组åˆçš„索引åQŒå¦‚æžœåˆ é™¤å…¶ä¸çš„æŸåˆ—åQŒåˆ™è¯¥åˆ—也会(x¨¬)从烦(ch¨³)引ä¸åˆ é™¤ã€‚å¦‚æžœåˆ é™¤ç»„æˆçƒ¦(ch¨³)引的所有列åQŒåˆ™æ•´ä¸ªç´¢å¼•ž®†è¢«åˆ 除