01羡宙、在 where 中使用不到的字段,不要設置索引
where 條件(包括 group by掐隐、order by)里用不到的字段不需要創(chuàng)建索引狗热,索引的價值是快速定位,如果起不到定位的字段通常是無需創(chuàng)建索引的虑省。
02匿刮、數(shù)據(jù)量小的表最好不要使用索引
如果表里記錄的數(shù)據(jù)太少,比如少于 1000 個探颈,那么是不需要創(chuàng)建索引的熟丸。表記錄太少的話,是否創(chuàng)建索引對查詢效率的影響是并不大的伪节。甚至說光羞,查詢花費的時間可能比遍歷索引的時間還要短,索引可能不會產(chǎn)生優(yōu)化效果怀大。
03纱兑、有大量重復數(shù)據(jù)的列上不要建立索引
在條件表達式中,建議給經(jīng)常用到的不同值較多的列上建立索引化借,但是字段中如果有大量重復數(shù)據(jù)潜慎,也不用建立索引。
比如:在學生表的 “性別” 字段上只有 <男><女> 兩個不同的值,所以無需建立索引铐炫。如果建立索引垒手,不但不會提高查詢效率,反而會嚴重降低數(shù)據(jù)的更新速度倒信。
如果要在 100w 行數(shù)據(jù)中查找其中的 50w 行(性別為男的數(shù)據(jù))科贬,一旦創(chuàng)建了索引,就需要先訪問 50w 次索引鳖悠,然后再訪問 50w 次數(shù)據(jù)表榜掌,這樣加起來的開銷比不適用索引可能還要大。
04竞穷、避免對經(jīng)常更新的表創(chuàng)建過多的索引
第一層含義:頻繁更新的字段不一定要創(chuàng)建索引唐责。因為更新數(shù)據(jù)的時候也需要更新索引鳞溉,如果索引太多瘾带,在更新索引的時候也會造成負擔,從而影響效率熟菲。
第二層含義:避免對經(jīng)常更新的表創(chuàng)建過多的索引看政,并且索引中
的列盡可能少。此時抄罕,雖然提高了查詢速度允蚣,同時卻會降低更新表的速度。
05呆贿、不建議用無序的值作為索引
例如身份證嚷兔、UUID(在索引比較時需要轉(zhuǎn)為 ASCII,并且插入時可能造成頁分裂)做入、MD5冒晰、HASH、無序長字符串等竟块。
06壶运、刪除不再使用或者很少使用的索引
表中的數(shù)據(jù)被大量更新,或者數(shù)據(jù)的使用方式被改變后浪秘,原有的一些索引可能不再需要蒋情。數(shù)據(jù)庫管理員應當定期找出這些索引將它們刪除,從而減少索引對更新操作的影響耸携。
07棵癣、不要定義冗余或重復的索引
① 冗余索引
例如:通過 idx_name_birthday_phone_number 索引就可以對 name 列進行快速搜索,再創(chuàng)建一個專門針對 name 列的索引就算是一個冗余索引夺衍,維護這個索引只會增加維護的成本浙巫,并不會對搜索有什么好處。
② 重復索引
例如:col1 既是主鍵、又給它定義為一個唯一索引的畴,還給它定義了一個普通索引渊抄,可是主鍵本身就
會生成聚簇索引,所以定義的唯一索引和普通索引是重復的丧裁,這種情況要避免护桦。