Mysql的索引失效(應避免)(十)

2021-09-05 09:17:19 字數 1155 閱讀 9494

type:system >const>eq_ref>ref>range>index>all

一般來說:查詢要達到index級別,最好能達到ref

案例1:

create index girl_cup_money on girl(age,cup_size,money);

show index from girl

explain select * from girl where  age='4';

explain select * from girl where age='4' and cup_size='b' ;

explain select * from girl where age='4' and cup_size='b'  and money='4';

explain select * from girl where  cup_size='b' ;

explain select * from girl where age='4'  and money='4';

explain select * from girl where  cup_size='b'  and money='4';

小結論:全值匹配我最愛

最佳左前提法則------如果索引了多列,要遵守最左前法則指的是查詢從索引的最左前列開始並且不跳過索引中的列

3.不在索引列上做任何操作(計算,函式,(自動or手動)型別轉換),都會導致索引失效而轉向全表掃瞄

如上:索引列沒使用函式,可以用到索引,使用函式不能用到索引

4.儲存引擎不能使用索引中範圍條件右邊的列(注意:範圍條件列可以使用到)

5.盡量使用覆蓋索引(只訪問索引的查詢(索引列和查詢列一致)),減少select *

6.mysql在使用不等於(!=或者<>)的時候無法使用索引會導致全表掃瞄

7.is null,is not null也無法使用索引

8.like以萬用字元開頭(%abc..)mysql索引實效會變成全表掃瞄的操作

%abc 和%abc%會變成全表掃瞄,abc%範圍掃瞄

解決%abc%時索引不被使用的方法:使用覆蓋索引,即查詢的內容包含在復合索引中

9字串不加單引號索引失效

上面的name=2000發生了隱式的型別轉換,int變成varchar,導致索引失效

10.少用or,用它來連線時會索引失效

避免索引失效

1.全值匹配,對索引中所有列都指定具體值。2.最左字首法則,如果索引有多列,要遵循最左字首法則。指的是查詢從索引的最左前列開始,並且不跳過索引中的列。否者不走索引。3.範圍查詢右邊的列,不走索引,應為mysql底層範圍查詢之後結構就斷了,就無法使用後面得索引了。4.不要在索引列上進行運算操作,索引將...

MySQL 中索引優化(即避免索引失效)

全值匹配 查詢欄位按順序在索引中都可以找到。最左字首法則 查詢欄位與索引欄位不同時,會導致索引失效,即如果索引了多列,則查詢欄位從索引最左前列開始,不要跳過已有索引列。不要再索引上做任何計算 包括計算 函式 自動或手動 型別轉換。索引列上不能有範圍 將可能做範圍查詢的字段放在索引順序的最後。盡量使用...

怎麼避免索引失效

首先在接著 之前,我們先說一下,如何判斷資料庫的索引是否生效!相信大家應該猜到了,就是explain!explain顯示了mysql如何使用索引來處理select語句以及連線表。他可以幫助選擇更好的索引和寫出更優化的查詢語句。例如我們有一張表user,為name列建立索引name index,如下所...