MySQL索引分類 何時情況下使用 何時失效

2021-10-20 13:26:10 字數 2162 閱讀 7064

目錄分類

何時使用

何時不使用索引

何時失效

explain語句

mysql索引分為普通索引、唯一索引、主鍵索引、組合索引、全文索引。索引不會包含有null值的列,索引項可以為null(唯一索引、組合索引等),但是只要列中有null值就不會被包含在索引中。

普通索引:create index index_name on table(column);或者建立表時指定,create table(..., index index_name column);

唯一索引:類似普通索引,索引列的值必須唯一(可以為空,這點和主鍵索引不同)create unique index index_name on table(column);或者建立表時指定unique index_name column

主鍵索引:特殊的唯一索引,不允許為空,只能有乙個,一般是在建表時指定primary key(column)

組合索引:在多個欄位上建立索引,遵循最左字首原則。alter table t add index index_name(a,b,c);

全文索引:主要用來查詢文字中的關鍵字,不是直接與索引中的值相比較,像是乙個搜尋引擎,配合match against使用,現在只有char,varchar,text上可以建立全文索引。在資料量較大時,先將資料放在一張沒有全文索引的表裡,然後再利用create index建立全文索引,比先生成全文索引再插入資料快很多。

mysql每次查詢只使用乙個索引。與其說是「資料庫查詢只能用到乙個索引」,倒不如說,和全表掃瞄比起來,去分析兩個索引b+樹更加耗費時間。所以where a=a and b=b這種查詢使用(a,b)的組合索引最佳,b+樹根據(a,b)來排序。

主鍵,unique欄位;

和其他表做連線的字段需要加索引;

在where裡使用>,≥,=,<,≤,is null和between等字段;

使用不以萬用字元開始的like,where a like 'china%';

聚集函式min(),max()中的字段;

order by和group by欄位;

表記錄太少;

資料重複且分布平均的字段(只有很少資料值的列);

經常插入、刪除、修改的表要減少索引;

text,image等型別不應該建立索引,這些列的資料量大(假如text前10個字元唯一,也可以對text前10個字元建立索引);

mysql能估計出全表掃瞄比使用索引更快時,不使用索引;

組合索引未使用最左字首,例如組合索引(a,b),where b=b不會使用索引;

like未使用最左字首,where a like '%china';

搜尋乙個索引而在另乙個索引上做order by,where a=a order by b,只使用a上的索引,因為查詢只使用乙個索引 ;

or會使索引失效。如果查詢字段相同,也可以使用索引。例如where a=a1 or a=a2(生效),where a=a or b=b(失效)

如果列型別是字串,要使用引號。例如where a='china',否則索引失效(會進行型別轉換);

在索引列上的操作,函式(upper()等)、or、!=(<>)、not in等;

type欄位為all,未使用索引;為ref,使用索引

all:全表掃瞄

index:索引全掃瞄

range:索引範圍掃瞄,常用語=,between等操作

ref:使用非唯一索引掃瞄或唯一索引字首掃瞄,返回單條記錄,常出現在關聯查詢中

eq_ref:類似ref,區別在於使用的是唯一索引,使用主鍵的關聯查詢

const/system:單條記錄,系統會把匹配行中的其他列作為常數處理,如主鍵或唯一索引查詢

null:mysql不訪問任何表或索引,直接返回結果

還有key欄位表示用到的索引,沒有用到為null

mysql哪些情況下索引會失效

索引並不是時時都會生效的,比如以下幾種情況,將導致索引失效 如果條件中有or,即使其中有條件帶索引也不會使用 這也是為什麼盡量少用or的原因 注意 要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引 2.對於多列索引,不是使用的第一部分,則不會使用索引 3.like查詢是以 開頭 4....

哪些情況下Mysql索引會失效

1 全值匹配我最愛 2 最佳左字首法則 3 不在索引列上做任何操作 計算 函式 自動or手動 型別轉換 會導致索引失效而轉向全表掃瞄 4 儲存引擎不能使用索引中範圍條件右邊的列 5 盡量使用覆蓋索引 只訪問索引的查詢 索引列和查詢列一致 減少select 6 mysql 在使用不等於 或者 的時候有...

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

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