in 索引失效的問題

2022-04-22 09:51:10 字數 1482 閱讀 8518

先安利一篇博文mysql的or/in/union與索引優化

簡單的in查詢 索引失效:

步驟1、檢查建立索引沒有

order_status 欄位為普通索引的tinyint型別 

2、檢查是否使用了使索引失效的語句

3、explain檢視執行計畫

而 in(1)時會走索引

5、檢視是否關閉的全域性的索引(comment顯示disabled則表示關閉了索引)   

show keys from wy_order;

關閉:alter table `wy_order` disable keys ;

開啟:alter table `wy_order` enable keys;

還找不到原因。。

難道是mysql查詢優化器認為全表掃瞄時如果速度大於使用索引,就會不用索引

此外,檢視索引的使用情況

show status like 『handler_read%';

注意:handler_read_key:這個值越高越好,越高表示使用索引查詢到的次數

handler_read_rnd_next:這個值越高,說明查詢低效

那麼使用強制索引呢

強制索引是生效的,求大佬告知(是mysql查詢優化器認為全表掃瞄時如果速度大於使用索引,就會不用索引)是不是我猜想的這樣呀

補充:索引失效

不走索引的情況,

1)被查詢出來的資料超過一定比例的時候,譬如表裡有1000萬條記錄,一條sql查的結果有600萬,肯定不會走索引了

2)索引列上用了函式的時候,例如where to_char(id) = ...

3)索引列上發生型別轉換的時候,如number列你偏寫成where col = '1',加了引號

4)沒有收集統計資訊的時候,cbo是生成執行計畫是要看統計資訊的,在oracle 9i時,統計資訊不是自動收集的,有沒有碰到這樣的情況:一條sql一直正常,某天突然很慢很慢,一般就是統計資訊沒有收集的原因。

5)強制全表掃瞄的時候

6)索引失效的時候

使用+ - * / ! 等運算符號

使用 <> 、not in 、not exist、!=

like "%_" 百分號在前(可採用在建立索引時用reverse(columnname)這種方法處理)

單獨引用復合索引裡非第一位置的索引列.應總是使用索引的第乙個列,如果索引是建立在多個列上, 只有在它的第乙個列被where子句引用時,優化器才會選擇使用該索引

當變數採用的是times變數,而表的字段採用的是date變數時.或相反情況

索引列存在null

7)復合索引時,謂詞非前導列的時候

mysql in 索引 失效 in 索引失效的問題

簡單的in查詢 索引失效 步驟1 檢查建立索引沒有 order status 欄位為普通索引的tinyint型別 2 檢查是否使用了使索引失效的語句 3 explain檢視執行計畫 而 in 1 時會走索引 5 檢視是否關閉的全域性的索引 comment顯示disabled則表示關閉了索引 show...

索引失效問題

今天用子查詢時遇到了索引失效的問題,就把解決的過程和大家分享一下吧。先是用in語句 select index table index index 欄位a tablea where 欄位b in 檢視執行計畫,發現沒有走索引。為什麼?在網上一檢視,一解釋是用in 時由於值不確定,所以不能走索引 in ...

索引失效問題

1 最佳左字首原則 如果索引了多列,要遵守最左字首原則。指的是查詢要從索引的最左前列開始並且不跳過索引中的列。2 不在索引列上做任何操作 計算,函式,自動或者手動 型別裝換 會導致索引失效而導致全表掃瞄 3 儲存引擎不能使用索引中範圍條件右邊的列,範圍之後索引失效。between and 4 mys...