目錄
一、如何判斷數據庫的索引是否生效
二、如何評估索引創建的是否合理
三、索引是否越多越好
四、如何處理數據庫索引失效
五、是否所有的字段都適合創建索引
一、如何判斷數據庫的索引是否生效
????????可以使用EXPLAIN語句查看索引是否正在使用。
? ? ? ? 例如,假設已經創建了book表,并已經在其year_publication字段上建立了普通索引。執行如下語句:
EXPLAIN SELECT * FROM book WHERE year_publication=1990;
????????EXPLAIN語句將為我們輸出詳細的SQL執行信息,其中:
? ? ? ? ①possible_keys行給出了MySQL在搜索數據記錄時可選用的各個索引。
? ? ? ? ②key行是MySQL實際選用的索引。
????????如果possible_keys行和key行都包含year_publication字段,則說明在查詢時使用了該索引。
二、如何評估索引創建的是否合理
????????建議按照如下的原則來設計索引:
????????1. 避免對經常更新的表進行過多的索引,并且索引中的列要盡可能少。應該經常用于查詢的字段創建索引,但要避免添加不必要的字段。
????????2. 數據量小的表最好不要使用索引,由于數據較少,查詢花費的時間可能比遍歷索引的時間還要短,索引可能不會產生優化效果。
????????3. 在條件表達式中經常用到的不同值較多的列上建立索引,在不同值很少的列上不要建立索引。比如在學生表的“性別”字段上只有“男”與“女”兩個不同值,因此就無須建立索引,如果建立索引不但不會提高查詢效率,反而會嚴重降低數據更新速度。
????????4. 當唯一性是某種數據本身的特征時,指定唯一索引。使用唯一索引需能確保定義的列的數據完整性,以提高查詢速度。
????????5. 在頻繁進行排序或分組(即進行group by或order by操作)的列上建立索引,如果待排序的列有多個,可以在這些列上建立組合索引。
三、索引是否越多越好
????????索引并非越多越好,一個表中如有大量的索引,不僅占用磁盤空間,還會影響INSERT、DELETE、UPDATE等語句的性能,因為在表中的數據更改時,索引也會進行調整和更新。
四、如何處理數據庫索引失效
????????可以采用以下幾種方式,來避免索引失效:
????????1. 使用組合索引時,需要遵循“最左前綴”原則;
????????2. 不在索引列上做任何操作,例如計算、函數、類型轉換,會導致索引失效而轉向全表掃描;
????????3. 盡量使用覆蓋索引(之訪問索引列的查詢),減少 select * 覆蓋索引能減少回表次數;
????????4. MySQL在使用不等于(!=或者<>)的時候無法使用索引會導致全表掃描;
????????5. LIKE以通配符開頭(%abc)MySQL索引會失效變成全表掃描的操作;
????????6. 字符串不加單引號會導致索引失效(可能發生了索引列的隱式轉換);
????????7. 少用or,用它來連接時會索引失效。
五、是否所有的字段都適合創建索引
????????不是。
????????下列幾種情況,是不適合創建索引的:
????????1. 頻繁更新的字段不適合建立索引;
????????2. where條件中用不到的字段不適合建立索引;
????????3. 數據比較少的表不需要建索引;
????????4. 數據重復且分布比較均勻的的字段不適合建索引,例如性別、真假值;
????????5. 參與列計算的列不適合建索引。