記錄資料庫中索引失效的問題

2021-09-10 12:06:39 字數 1872 閱讀 4208

昨天碰到乙個很有意思的問題,乙個sql 語句,加上 softuseline like '%oqc%' 之後,速度就特別慢。去掉該條件之後,速度就快起來了。

檢視sql 語句的執**況,發現加上那個查詢條件之後,softwaredetailinfo表的邏輯讀取變成了1300374 次,

可是這個查詢字段明明已經加上index_softwaredetail索引了,怎麼會邏輯讀取還這麼大呢。檢視sql profile 的詳細資訊,發現sql 語句,沒有走那個索引。

於是,加上with(index(index_softwaredetail)) ,讓sql 必須走這個索引試試。sql查詢立馬變快了。sql profile 顯示,已經走了index_softwaredetail索引。看來是索引建立的有問題,導致查詢計畫,沒有走該索引,而是進行全表掃瞄。所以導致查詢速度變慢。

於是把所有索引重新調整下。ok了。

資料庫中索引什麼時候會失效呢?

總結下資料庫中索引失效的問題,不過有些沒有經過測試。這裡僅供自己參考。

首先,所謂失效。並不真的就是這個索引被刪除了。而是在某些情況下,dbms不會檢索索引列表了。執行速度和沒有這個索引時的速度一樣。但是再執行另外的一條語句。同樣的索引又正常起作用。所以索引的失效是針對某條sql語句,某個查詢條件的,而不是針對索引本身的。

哪類語句執行時索引不起作用呢。總結如下:

1. 索引字段進行判空查詢時。也就是對索引字段判斷是否為null時。語句為is null 或is not null。

比如:select * from softwaredetailinfo where createtime is null 此時就不檢索time欄位上的索引表了。也就是索引在這條語句執行時失效了。

接著再執行

select * from softwaredetailinfo where createtime = '2015-04-11 00:00:00' 此時就會檢索索引表了。索引又起作用了。

2. 對索引字段進行like查詢時。比如:select * from softwaredetailinfo where softuseline like '%oqc%'。不過網上有的例子說like 'xx%'索引起作用。我沒試過。

3. 判斷索引列是否不等於某個值時。『!=』操作符。比如:select * from softwaredetailinfo where softuseline != 0

4. 對索引列進行運算。這裡運算包括+-*/等運算。也包括使用函式。比如:

select * from softwaredetailinfo where softuseline +0= 0

此時索引不起作用。

select * from softwaredetailinfo where count(softuseline) = 0

此時索引也不起作用。

也就是說如果不是直接判斷索引欄位列,而是判斷運算或其它函式處理後的索引列索引均不起作用。

5. 復合索引中的前導列沒有被作為查詢條件。比如:index_softwaredetail索引包含(a,b,c) 三列,但是查詢條件裡面,沒有a,b 列,只有c 列,那麼 index_softwaredetail索引也不起作用。

posted @

2015-04-14 11:15

章為忠 閱讀(

...)

編輯收藏

記錄資料庫中索引失效的問題

昨天碰到乙個很有意思的問題,乙個sql 語句,加上 softuseline like oqc 之後,速度就特別慢。去掉該條件之後,速度就快起來了。檢視sql 語句的執 況,發現加上那個查詢條件之後,softwaredetailinfo表的邏輯讀取變成了1300374 次,可是這個查詢字段明明已經加上...

記錄資料庫中索引失效的問題

昨天碰到乙個很有意思的問題,乙個sql 語句,加上 softuseline like oqc 之後,速度就特別慢。去掉該條件之後,速度就快起來了。檢視sql 語句的執 況,發現加上那個查詢條件之後,softwaredetailinfo表的邏輯讀取變成了1300374 次,可是這個查詢字段明明已經加上...

記錄資料庫中索引失效的問題

昨天碰到乙個很有意思的問題,乙個sql 語句,加上 softuseline like oqc 之後,速度就特別慢。去掉該條件之後,速度就快起來了。檢視sql 語句的執 況,發現加上那個查詢條件之後,softwaredetailinfo表的邏輯讀取變成了1300374 次,可是這個查詢字段明明已經加上...