索引
索引的使用
什么時(shí)候使用索引表的主關(guān)鍵字
- 表的字段唯一約束
- 直接條件查詢的字段
- 查詢中與其它表關(guān)聯(lián)的字段
- 查詢中排序的字段
- 查詢中統(tǒng)計(jì)或分組統(tǒng)計(jì)的字段
什么情況下應(yīng)不建或少建索引
- 表記錄太少
- 經(jīng)常插入、刪除京革、修改的表
- 數(shù)據(jù)重復(fù)且分布平均的表字段
- 經(jīng)常和主字段一塊查詢但主字段索引值比較多的表字段
復(fù)合索引
命中規(guī)則
- 需要加索引的字段拿诸,需要在where條件中
- 數(shù)據(jù)量少的字段不需要索引
- 如果where條件中是or條件票摇,加索引不起作用
- 符合最左原則
- 最左原則:Mysql從左到右的使用索引中的字段私痹,一個(gè)查詢可以只使用索引中的一部份,但只能是最左側(cè)部分宣脉。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3種組合進(jìn)行查找宁昭,但不支持 b,c進(jìn)行查找
- 在創(chuàng)建符合索引時(shí),應(yīng)該仔細(xì)考慮列的順序相种,對索引中的所有列搜索或?qū)﹀X幾列進(jìn)行搜索時(shí)威恼,符合索引非常有用。
- 當(dāng)一個(gè)表有多條索引可走時(shí), Mysql 根據(jù)查詢語句的成本來選擇走哪條索引, 聯(lián)合索引的話, 它往往計(jì)算的是第一個(gè)字段(最左邊那個(gè)), 這樣往往會走錯(cuò)索引
在mysql中使用索引注意
- 只要列中包含有null值將不會包含在索引中寝并,復(fù)合索引只要有一列含有null值箫措,那么這一列對于此復(fù)合索引就是無效的
- 對串列進(jìn)行索引,如果可能應(yīng)該指定一個(gè)前綴長度
- mysql查詢只使用一個(gè)索引衬潦,因此如果where子句中已經(jīng)使用了索引的話斤蔓,那么order by中的列是不會使用索引的。因此數(shù)據(jù)庫默認(rèn)排序可以符合要求的情況下不要使用排序操作镀岛;盡量不要包含多個(gè)列的排序弦牡,如果需要最好給這些列創(chuàng)建復(fù)合索引。
- like “%aaa%” 不會使用索引而like “aaa%”可以使用索引漂羊。
- 不要在列上進(jìn)行運(yùn)算
- NOT IN和操作都不會使用索引將進(jìn)行全表掃描驾锰。NOT IN可以NOT EXISTS代替