1.什么情況不適合創建索引?
- 列的離散程度不高:即使創建了索引,也不會走索引,因為需要額外的回表操作,它的cost可能會比全表掃表更高。
- 不經常查詢的字段:創建索引會占用額外的存儲開銷、性能開銷。
- 頻繁更新的字段:頻繁更新會導致頻繁頁分裂,需要遷移數據,會降低性能。
- 字段數據占用空間過大:會導致索引節點的數據頁能存儲的索引數量變少,從到導致索引的路數表少,深度表深,IO次數變多。(推薦使用前綴索引)
- 已經存在聯合索引的首字段:無需重復創建索引。
2.什么情況索引會失效?
- 列的離散程度不高
- 負向查詢(not in、!= 、<>): 導致使用索引檢索是,無法判斷大小,無法過濾數據。
- 索引字段上面有函數:索引上加上了函數,相當於改變了索引結構,無法使用索引檢索數據。
- 最左匹配原則(like '%aaa%'): 導致使用索引檢索是,無法判斷大小,無法過濾數據。
- 沒有使用聯合索引第一個字段: 聯合索引是數據是拼接的,沒有第一個字段的數據,好比like '%aaa%' , 導致使用索引檢索是,無法判斷大小,無法過濾數據。
- 字符串索引的值不加引號:數據類型不一致,無法比較。