什麼情況下MySQL的索引會失效

2021-10-08 17:46:40 字數 3038 閱讀 3296

在某些情況下我們會發現乙個問題,明明這個字段新增了索引,但是奇怪的是是查詢的時候索引並沒有生效,下面就這幾種索引失效的情況做以總結。假如我們建立了乙個 test表及相關索引。

drop

table

ifexists

`test`

;create

table

`test`

(`id`

int(11)

notnull

auto_increment

,`name`

varchar

(255

)default

null

,`age`

int(3)

default

null

,`gender`

int(1)

default

null

,primary

key(

`id`),

key`index_age_gender`

(`age`

,`gender`

)using

btree

,key

`index_name`

(`name`

(191))

using

btree

)engine

=innodb

auto_increment=1

default

charset

=utf8mb4;

當使用like關鍵字時,如果查詢條件以%開頭,索引無效;當like字首沒有%,字尾有%時,索引依然有效。

explain

select

*from test where

`name`

like

"%";

explain

select

*from test where

`name`

like

"%1"

;

explain

select

*from test where

`name`

like

"1%"

;explain

select

*from test where

`name`

like

"1";

當使用or關鍵字時,or語句前後沒有同時使用索引或當or關鍵字左右查詢字段只有乙個是索引,該索引失效,只有當or左右查詢欄位均為索引時,才會生效。

id為主鍵索引,gender沒有索引

id和name均有索引

explain

select

*from test where

(id =1or

`name`

='測試2'

);

使用組合索引時,如果查詢條件不包括該組合索引全部欄位或查詢條件不是該組合索引左邊第乙個欄位時,索引失效。

gender為組合索引右邊的字段

age為組合索引左邊的字段

資料型別出現隱式轉化。如某個索引欄位的資料型別為varchar,查詢內容為123,如不加引號的話可能會自動轉換為int型,使索引無效,產生全表掃瞄。

引數為:123

explain

select

*from test where name =

123;

引數為:「123」

explain

select

*from test where name =

'123'

;

not不會用到索引的,因此對它的處理只會產生全表掃瞄。

explain

select

*from test where

`name`

isnot

null

;

運算子同樣不會用到索引

對索引字段進行計算操作、欄位上使用函式,索引失效。

explain

select

*from test where abs(id)=1

;

全表掃瞄的速度大於索引速度時,索引失效。如表內資料極少。

MySQL索引在什麼情況下會失效

索引的失效,會大大降低sql的執行效率,日常中又有哪些常見的情況會導致索引失效?對查詢進行優化,應盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引。應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄,如 sele...

什麼情況下需要建立mysql索引

1 較頻繁地作為查詢條件的字段 這個都知道。什麼是教頻繁呢?分析你執行的所有sql語句。最好將他們乙個個都列出來。然後分析,發現其中有些欄位在大部分的sql語句查詢時候都會用到,那麼就果斷為他建立索引。2 唯一性太差的字段不適合建立索引 什麼是唯一性太差的字段。如狀態字段 型別字段。那些只儲存固定幾...

什麼情況下需要建立MySQL索引?

索引可以提高資料的檢索效率,也可以降低資料庫的io成本,並且索引還可以降低資料庫的排序成本。排序分組操作主要消耗的就是cpu資源和記憶體,所以能夠在排序分組操作中好好的利用索引將會極大地降低cpu資源的消耗。如何判定是否需要建立索引?1 較頻繁地作為查詢條件的字段 程式設計客棧這個都知道。什麼是教頻...