先安利一篇博文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...