哪些情況下不需要使用索引
1、數據唯一性差的字段不要使用索引比如性別,只有兩種可能數據。意味着索引的二叉樹級別少,多是平級。這樣的二叉樹查找無異於全表掃描。2、頻繁更新的字段不要使用索引比如logincount登錄次數,頻繁變化導致索引也頻繁變化,增大數據庫工作量,降低效率。3、字段不在where語句出現時不要添加索引只有在where語句出現,mysql才會去使用索引4、數據量少的表不要使用索引,使用了改善也不大
5、如果mysql估計使用全表掃描要比使用索引快,則不會使用索引。
索引不可用的情況
有一天我遇到了一個同事的求助,他讓我幫忙優化一個SQL,這個SQL執行時間很長。於是我查詢了執行計划,發現這個SQL竟然要進行一次全表掃描。當時我查看了表的定義,發現在where子句中的條件列上是建了索引的,那為什么執行計划會顯示全表掃描呢。這個問題困擾了我很長時間,於是后來我又看了看表的定義,發現了問題的根本所在:作為條件的字段是varchar,而SQL語句中的條件是一串數字!
這樣的話就會造成索引不可用,處理方法也很簡單,加上一對單引號就可以了。
以下幾種情況索引不會被使用
1、不等於操作不能用於索引
2、經過普通或者函數運算的索引列不能使用索引
3、含前向模糊查詢(通配符%在搜索詞首出現),比如“like %王xx”【反向鍵索引:reverse】
4、索引列為空,或包含空值
5、數值比較時左右類型不同,相當於做了隱式類型轉換
6、給索引查詢的值是未知字段,而不是已知數
注:
1、通配符放在后面不一定就能走索引,因為這時對索引是一個范圍掃描,如果oracle通過統計數據認為這個范圍比較大,那么走索引得到的代價評估值就更大,這時就不會選擇走索引。
2、如果通配符放在前面,oracle幾乎可以肯定是不會選擇走索引的(除非oracle確定該sql只需要訪問該索引而不需要訪問表)。因為這時必須是索引全掃描,而全掃描索引本身就會消耗大量 資源,然后再根據得出的rowid(很有可能也很多)去掃描表又要消耗大量資源,這個查詢總共消耗的資源很可能會比直接掃描全表慢很多。
3、如果你認為自己比oracle更了解自己的查詢語句和數據分布情況,你確定更多情況走索引是正確的,那就使用hint強制要求走索引。
