索引注意事項
(1)最左字首原則
如果查詢的時候,查詢條件精確匹配索引的左邊連續一列或幾列,則可以命中索引。
(2)避免where 子句中對欄位施加函式,如to_date(create_time)>xxxxxx,這樣會造成無法命中索引。
(3)在使用InnoDB 時,使用與業務無關的自增主鍵作為主鍵,即使用邏輯主鍵,而不要使用業務主鍵。
(4)合理利用索引覆蓋
覆蓋索引(Covering index)指一個查詢語句的執行,只需要從輔助索引中就可以得到查詢記錄,而不需要查詢聚集索引中的記錄,也可以稱之為實現了索引覆蓋。
簡單來說,就是查詢條件命中了索引,而查詢欄位也屬於索引中的欄位。
當實現了覆蓋索引的時候,explain 命令的Extra 會顯示 using Index。
(5)避免冗餘索引
可以查詢sys 庫的schemal_redundant_indexes 表來檢視冗餘索引。
(6)將打算加索引的列設定為 NOT NULL,否則將導致引擎放棄使用索引,而進行全表掃描。
(7)刪除長期未使用的索引
可以查詢sys 庫的 schema_unused_indexes 檢視來查詢從未使用過的索引。
(8)聯表查詢,也可以使用索引:
-
確保 ON 和 USING 中列上有索引。
-
確保任何的 GROUP BY 和 ORDER BY 中的表示式只涉及一個表中列。
(9)查詢條件的欄位應使用正確的資料型別,否則MySQL 會自動做型別轉換,導致無法命中索引。
索引的代價:
1. 索引檔案本身要消耗儲存空間;
2. 在被索引的表上,INSERT/DELETE 會變慢;
3. MySQL在執行是,也要消耗資源維護索引;