索引使用注意事項


哪些情況下不需要使用索引

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強制要求走索引。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM