MySQL索引建立於是否失效的情況

2021-10-25 08:12:28 字數 4863 閱讀 8534

索引:索引是對錶中的一列或者多列的資料進行排序的物理結構。

5.7.29 mysql community server (gpl)

create table t_user (

id int not null auto_increment primary key,

name varchar(255),

age int,

msg varchar(255)

);

insert into t_user (name,age,msg) values ('andy',18,'a'),('jerry',20,'j'),('kelly',25,'k');
alter table tmp_table add index name_age_msg(name,age,msg);
id

name

agemsg

1andy18a

2jerry20j

3kelly25k

index:雖然all和index都是掃瞄全表,但index從索引中讀取的,all是從硬碟中讀取的。

ref:非唯一性索引掃瞄,返回匹配某個單獨值的所有行,

本質上也是一種索引訪問,它返回所有匹配某個單獨值的行,然而它可能會找到多個符合條件的行,所以屬於查詢和掃瞄的混合體。

語句type

keyexplain select * from t_user where name = 『andy』\g;

refname_age_msg

explain select * from t_user where age = 20\g;

index

name_age_msg

explain select * from t_user where msg = 『a』\g;

index

name_age_msg

explain select * from t_user where name=『andy』 and age=15\g;

refname_age_msg

explain select * from t_user where name=『andy』 and age=15 and msg=『a』\g;

refname_age_msg

explain select * from t_user where name=『andy』 and msg=『a』\g;

refname_age_msg

explain select * from t_user where age=15 and msg=『a』\g;

index

name_age_msg

explain select * from t_user where age=15 and msg=『a』 and name=『andy』\g;

refname_age_msg

explain select * from t_user where age=15 or msg=『a』 or name=『andy』\g;

index

name_age_msg

explain select * from t_user where age=15 or msg=『a』\g;

index

name_age_msg

explain select * from t_user where name=『andy』 or age=15\g;

index

name_age_msg

接下來建立新的一列,並且此列沒有索引。

alter table t_user add column location varchar(255);
現在表中的內容如下:id

name

agemsg

location

1andy15a

text

2jerry20j

text

3kelly25k

text

重複上面的語句,檢視聯合索引使用情況:

重複上面的語句,檢視聯合索引使用情況:

序號語句

type

key1

explain select * from t_user where name = 『andy』\g;

refname_age_msg

2explain select * from t_user where age = 20\g;

allnull

3explain select * from t_user where msg = 『a』\g;

allnull

4explain select * from t_user where name=『andy』 and age=15\g;

refname_age_msg

5explain select * from t_user where name=『andy』 and age=15 and msg=『a』\g;

refname_age_msg

6explain select * from t_user where name=『andy』 and msg=『a』\g;

refname_age_msg

7explain select * from t_user where age=15 and msg=『a』\g;

allnull

8explain select * from t_user where age=15 and msg=『a』 and name=『andy』\g;

refname_age_msg

9explain select * from t_user where age=15 or msg=『a』 or name=『andy』\g;

allnull

10explain select * from t_user where age=15 or msg=『a』\g;

allnull

11explain select * from t_user where name=『andy』 or age=15\g;

allnull

12explain select * from t_user where name=『andy』 or location=『text』\g;

allnull

13explain select * from t_user where name=『andy』 and msg=『a』 and location = 『text』\g;

refname_age_msg

14explain select * from t_user where name=『andy』 and msg=『a』 or location = 『text』\g;

allnull

15explain select * from t_user where name=null\g

null

null

16explain select * from t_user where name=』』\g

refname_age_msg

17explain select * from t_user where name is null\g

refname_age_msg

18explain select * from t_user where name is null and msg is null\g

refname_age_msg

如上,聯合索引會建立(name),(name,age),(name,age,msg)這三個索引。

1,聯合索引遵循最左匹配原則,在where…and語句中必須包含name這個「最左欄位」,不然的話聯合索引不生效。

但是where…and語句中的聯合索引這三個欄位的順序可以不一致,只要包含最左的字段就可以使索引生效,因為mysql的sql優化器會優化這些**。

2,聯合索引對or關係不起作用,必須要使用and作為條件

3,使用and作為條件查詢,即使存在無索引的條件字段,只要存在有索引的列,explain的結果也會使用到索引,

但是如果使用or作為條件查詢,那麼只要其中乙個字段沒有索引,就不會使用索引,而是全表掃瞄。

1,col=null無法使用索引,並且也查詢不出資料。

2,是否使用索引只與查詢條件是否使用col=null有關,而與列的資料是否存在null值的行無關。

3,空字串與null並不相等,且不可替換,針對這兩個值的查詢語句和結果都不一樣。

如果name列存在一行值為空字串,則需要使用name=''條件來查詢。並且可以使用索引。

1,詢條件中包含!=<>

2,條件中有or,但是有其中乙個or沒有建立index

3,like查詢以%開頭

4,如果列型別是字串,那要在條件中將資料用引號引用起來,即使查詢的資料是乙個字串整型。

5,如果查詢條件裡面包含col=null則此列的索引不生效。並且也查詢不出資料,必須使用col is null語句才能使索引生效。

6,如果mysql查詢優化器估計使用全表掃瞄要比使用索引快,則不使用索引。

mysql索引失效 MySQL索引失效的幾種情況

1.索引無法儲存null值 a.單列索引無法儲null值,復合索引無法儲全為null的值。b.查詢時,採用is null條件時,不能利用到索引,只能全表掃瞄。為什麼索引列無法儲存null值?a.索引是有序的。null值進入索引時,無法確定其應該放在 將索引列值進行建樹,其中必然涉及到諸多的比較操作,...

mysql索引建立的場景以及索引失效的問題

對於查詢頻率高的字段建立索引 對排序 分組 聯合查詢頻率高的字段建立索引 如果需要將多個列設定為索引時,可以採用多列索引 選擇唯一性索引 名字不行 盡量使用資料量少的索引,刪除不再使用或者很少使用的索引,數目不宜太多 1.索引列出現函式引數或者表示式 解決方案 事先計算好表示式的值 2.使用左模糊 ...

MySQL建立索引 判斷索引是否生效

mysql建立索引 現有資料表 jingjia info,共658行資料 查詢表中使用的索引 show index from 表名 檢視查詢語句中是否使用了索引 方式一 explain 查詢語句 explain select from jingjia info 方式二 使用時間檢測 執行時間檢測 s...