索引失效的7種情況

2021-10-24 02:18:22 字數 1452 閱讀 7655

1.有or必全有索引;

2.復合索引未用左列字段;

3.like以%開頭;

4.需要型別轉換;

5.where中索引列有運算;

6.where中索引列使用了函式;

7.如果mysql覺得全表掃瞄更快時(資料少);

1.唯一性差;

2.頻繁更新的字段不用(更新索引消耗);

3.where中不用的字段;

4.索引使用<>時,效果一般;

索引並不是時時都會生效的,比如以下幾種情況,將導致索引失效:

如果條件中有or,即使其中有部分條件帶索引也不會使用(這也是為什麼盡量少用or的原因),例子中user_id無索引

注意:要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引

對於復合索引,如果不使用前列,後續列也將無法使用,類**簿。

like查詢是以%開頭

存在索引列的資料型別**轉換,則用不上索引,比如列型別是字串,那一定要在條件中將資料使用引號引用起來,否則不使用索引

where 子句裡對索引列上有數**算,用不上索引

where 子句裡對有索引列使用函式,用不上索引

如果mysql估計使用全表掃瞄要比使用索引快,則不使用索引

比如資料量極少的表

使用內部函式導致索引失效.對於這樣情況應當建立基於函式的索引.

錯誤的例子:select * from test where round(id)=10; 說明,此時id的索引已經不起作用了

正確的例子:首先建立函式索引,create index test_id_fbi_idx on test(round(id));

然後 select * from test where round(id)=10; 這時函式索引起作用了

資料唯一性差(乙個欄位的取值只有幾種時)的字段不要使用索引

比如性別,只有兩種可能資料。意味著索引的二叉樹級別少,多是平級。這樣的二叉樹查詢無異於全表掃瞄。

頻繁更新的字段不要使用索引。比如logincount登入次數,頻繁變化導致索引也頻繁變化,增大資料庫工作量,降低效率。

欄位不在where語句出現時不要新增索引,如果where後含is null /is not null/ like 『%輸入符%』等條件,不建議使用索引

只有在where語句出現,mysql才會去使用索引

where 子句裡對索引列使用不等於(<>),使用索引效果一般

此外,檢視索引的使用情況可以使用以下語句:show status like 『handler_read%';

大家可以注意:

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

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

索引失效的7種情況

1.有or必全有索引 2.復合索引未用左列字段 3.like以 開頭 4.需要型別轉換 5.where中索引列有運算 6.where中索引列使用了函式 7.如果mysql覺得全表掃瞄更快時 資料少 1.唯一性差 2.頻繁更新的字段不用 更新索引消耗 3.where中不用的字段 4.索引使用 時,效果...

mysql 索引失效的7種情況

1.有or必全有索引 2.復合索引未用左列字段 3.like以 開頭 4.需要型別轉換 5.where中索引列有運算 6.where中索引列使用了函式 7.如果mysql覺得全表掃瞄更快時 資料少 1.唯一性差 2.頻繁更新的字段不用 更新索引消耗 3.where中不用的字段 4.索引使用 時,效果...

索引失效的若干種情況

0.建表 上圖首先建了乙個staffs表,然後插入了三條資料,最後建立在乙個組合索引 2.索引優化 我們把組合索引比作成一輛火車,第乙個欄位為火車頭,其他的字段比作一節車廂,火車能執行的前提條件是火車頭不能斷掉,如果中間車廂斷了,那麼後續車廂也不能跑了.總之能夠跑動的車廂所代表的索引都有效.也就是說...