like索引失效原因 索引失效的情況及原因定位

2021-10-17 10:28:45 字數 913 閱讀 6290

同事遇到乙個奇葩的問題,乙個表裡某個欄位建了索引,但是有的值走索引,有的值不走索引。因為一般情況乙個字段要麼完全不走索引,要麼走索引,怎麼會有的值走索引,有的不走索引。

select 條件非常簡單,因為涉及到敏感資訊就不貼表結構了。例如select * from order where status = 2; status為狀值。分別為-1刪除,1正常,2待定。因為sql比較簡單,所以排除字首原則、like 、in 及where條件等號左邊有函式不走索引的情況。百思不得其解。

然後為了進一步定位問題,看是不是索引建的多的原因,又去其它表裡看了一下,不是這個原因。

那是什麼原因呢?因為只有2不索引,所以我又試了一下其它值都走索引,我將2改為3試一下,結果奇蹟發生了,2居然走索引了。再試一下status=3。也走索引,我懷疑是邊界的問題。然後google一下關於索引是否有邊界這樣的情況影響索引。也沒有結果。

那我想再把所有2改為3,現試一下,是不是跟這些資料有關,奇蹟發生了!status=3也沒走索引。進一步縮小範圍。為什麼status=3也不走索引呢?然後我想到了是不是跟索引的稀疏性有關?也就是說因為重複的資料所以優化器判斷索引無效所以不走索引呢?

我又把status=3改回去,觀察一下重複資料分布,status=2的條數為3條,status=-1有兩條,status=1有兩條,我再把其中一條status=4,發現都走索引了。為了進一步驗證自己的結論,又試了一下將其中一條status=2改為1,結果status=1不走索引了。更進一步驗證了自己的判斷!

所以這次的問題就是因為當資料表中資料比較稀疏時,而當欄位個數比較少時,優化器會認為這個索引效果不明顯,所以不走索引。

進一步我和同事又將status的索引去掉,發現expalin 的rows列顯示所有行,無論status為任意值。而如果status建索引的話重複的比較多的不走索引。所以結果是建索引效能提公升不大。具體根據自己的情況來建索引。

索引失效的原因

1 隱式轉換導致索引失效.這一點應當引起重視.也是開發中經常會犯的錯誤.由於表的字段tu mdn定義為varchar2 20 但在查詢時把該字段作為number型別以where條件傳給oracle,這樣會導致索引失效.錯誤的例子 select from test where tu mdn 13333...

索引失效原因分類

1 沒有查詢條件,或者查詢條件沒有建立索引 2 在查詢條件上沒有使用復合索引引導列 3 查詢的資料量超過了表資料量的15 4 索引本身失效 status unusable 5 查詢條件使用函式在索引列上 6 對小表查詢 7 使用hint提示不使用索引 8 統計資訊不真實 9 cbo認為走全表掃瞄比走...

索引失效原因總結

今天乙個同事突然問我索引為什麼失效。說實在的,失效的原因有多種 但是如果是同樣的sql如果在之前能夠使用到索引,那麼現在使用不到索引,以下幾種主要情況 1.隨著表的增長,where條件出來的資料太多,大於15 使得索引失效 會導致cbo計算走索引花費大於走全表 2.統計資訊失效 需要重新蒐集統計資訊...