01、在 where 中使用不到的字段,不要設(shè)置索引
where 條件(包括 group by、order by)里用不到的字段不需要創(chuàng)建索引,索引的價值是快速定位,如果起不到定位的字段通常是無需創(chuàng)建索引的。
02、數(shù)據(jù)量小的表最好不要使用索引
如果表里記錄的數(shù)據(jù)太少,比如少于 1000 個,那么是不需要創(chuàng)建索引的。表記錄太少的話,是否創(chuàng)建索引對查詢效率的影響是并不大的。甚至說,查詢花費(fèi)的時間可能比遍歷索引的時間還要短,索引可能不會產(chǎn)生優(yōu)化效果。
03、有大量重復(fù)數(shù)據(jù)的列上不要建立索引
在條件表達(dá)式中,建議給經(jīng)常用到的不同值較多的列上建立索引,但是字段中如果有大量重復(fù)數(shù)據(jù),也不用建立索引。
比如:在學(xué)生表的 “性別” 字段上只有 <男><女> 兩個不同的值,所以無需建立索引。如果建立索引,不但不會提高查詢效率,反而會嚴(yán)重降低數(shù)據(jù)的更新速度。
如果要在 100w 行數(shù)據(jù)中查找其中的 50w 行(性別為男的數(shù)據(jù)),一旦創(chuàng)建了索引,就需要先訪問 50w 次索引,然后再訪問 50w 次數(shù)據(jù)表,這樣加起來的開銷比不適用索引可能還要大。
04、避免對經(jīng)常更新的表創(chuàng)建過多的索引
第一層含義:頻繁更新的字段不一定要創(chuàng)建索引。因?yàn)楦聰?shù)據(jù)的時候也需要更新索引,如果索引太多,在更新索引的時候也會造成負(fù)擔(dān),從而影響效率。
第二層含義:避免對經(jīng)常更新的表創(chuàng)建過多的索引,并且索引中
的列盡可能少。此時,雖然提高了查詢速度,同時卻會降低更新表的速度。
05、不建議用無序的值作為索引
例如身份證、UUID(在索引比較時需要轉(zhuǎn)為 ASCII,并且插入時可能造成頁分裂)、MD5、HASH、無序長字符串等。
06、刪除不再使用或者很少使用的索引
表中的數(shù)據(jù)被大量更新,或者數(shù)據(jù)的使用方式被改變后,原有的一些索引可能不再需要。數(shù)據(jù)庫管理員應(yīng)當(dāng)定期找出這些索引將它們刪除,從而減少索引對更新操作的影響。
07、不要定義冗余或重復(fù)的索引
① 冗余索引
例如:通過 idx_name_birthday_phone_number 索引就可以對 name 列進(jìn)行快速搜索,再創(chuàng)建一個專門針對 name 列的索引就算是一個冗余索引,維護(hù)這個索引只會增加維護(hù)的成本,并不會對搜索有什么好處。
② 重復(fù)索引
例如:col1 既是主鍵、又給它定義為一個唯一索引,還給它定義了一個普通索引,可是主鍵本身就
會生成聚簇索引,所以定義的唯一索引和普通索引是重復(fù)的,這種情況要避免。