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

2021-10-17 12:34:40 字數 1415 閱讀 4898

簡單的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變數時.或相反情況

索引列存在null7)復合索引時,謂詞非前導列的時候

mysql索引失效 常見mysql索引失效條件

使用索引的一般語句 1 where條件中有or,除非or的所有欄位都有索引,只要有乙個沒有索引,就不走索引 explain select from jf user ju where ju.user id or ju.superior1 yyy user id是主鍵,superior1是普通索引,結果...

mysql 主鍵失效 MySQL索引(索引失效)

索引 索引也是一張表,該錶儲存了主鍵與索引字段,並指向實體表的記錄。myisam儲存引擎,資料檔案 索引檔案 表結構檔案分開儲存 innodb儲存引擎,資料和索引儲存在乙個檔案中 b tree索引 hash索引 hash索引 只有memory儲存引擎支援 查詢一條記錄的速度非常快 b tree索引 ...

mysql 索引失效場景 Mysql 索引失效場景

例如 一張user表 有欄位屬性 name,age 其中name為索引 下面列舉幾個索引失效的情況 1.select from user where name xzz or age 16 例如這種情況 當語句中帶有or的時候 即使有索引也會失效。2.select from user where na...