MySQL索引一些常用案例

2021-10-22 13:06:31 字數 3175 閱讀 3606

create table test(

id int primary key not null auto_increment,

c1 char(10),

c2 char(10),

c3 char(10),

c4 char(10),

c5 char(10)

);insert into test(c1,c2,c3,c4,c5)values('a1','a2','a3','a4','a5');

insert into test(c1,c2,c3,c4,c5)values('b1','b2','b3','b4','b5');

insert into test(c1,c2,c3,c4,c5)values('c1','c2','c3','c4','c5');

insert into test(c1,c2,c3,c4,c5)values('d1','d2','d3','d4','d5');

insert into test(c1,c2,c3,c4,c5)values('e1','e2','e3','e4','e5');

create index idx_test_c1234 on test(c1,c2,c3,c4);
explain select * from test where c1='a1' and c2='a2' and c3='a3' and c4='a4';

# and連線每個索引字段,順序是c1,c2,c3,c4.當前最佳匹配,所有索引都用上,並遵循最左字首,當然精度越高,key_len越高,代價越大。

explain select * from testwhere c1='a1' and c2='a2' and c4='a4' and c3='a3';

# 雖然查詢條件順序發生改變,但c1,c2,c3,c4都能用到索引查詢。因mysql內部會做優化。

explain select * from testwhere c4='a4' and c3='a3' and c2='a2' and c1='a1';

# 與上例一樣結論,and連線可忽略順序。sql內部會做優化

explain select * from testwhere c1='a1' and c2='a2' and c3>'a3' and c4='a4';

# c1,c2能用到索引進行查詢,因c3是範圍條件,索引只用到排序,導致在c3處斷裂,這樣c4用不到索引

explain select * from testwhere c1='a1' and c2='a2' and c4>'a4' and c3='a3';

# 都能用到索引,首先mysql 根據and連線,內部優化順序,只不過是c1,c2,c3用索引是用來查詢, 而c4用索引進行排序

explain select * from test where c1='a1' and c2='a2' and c4='a4' order by c3;

# 用到c1,c2索引進行查詢,c3也用到了索引只不過是用來排序,並c3沒有統計到執行計畫中,c4沒有用到索引

explain select * from testwhere c1='a1' and c2='a2' order by c3;

# 與上例一樣。根據跟上例對比,可以發現c4的索引並沒有起效。原因c3索引用於範圍查詢,導致c4無法利用索引。

explain select * from testwhere c1='a1' and c2='a2' order by c4;

# c1,c2使用索引進行查詢,但是中間跳過c3直接使用c4進行排序,導致sql內部使用filesort進行排序。

explain select * from test where c1='a1' and c5='a5' order by c2,c3;

# 因為c5沒有建立索引,所以c5沒有用到索引。而c1使用索引進行查詢,c2,c3使用索引進行排序

explain select * from test where c1='a1' and c5='a5' order by c3,c2;

# 與上例不同extra出現filesort ,c3,c2順序顛倒,sql內部無法識別,所以sql內部使用filesort進行排序

explain select * from test where c1='a1' and c2='a2' order by c2,c3;

# c1,c2用到索引查詢。c2,c3用來排序。

explain select * from test where c1='a1' and c2='a2' and c5='c5' order by c2,c3;

# 與上例結果一樣, c5並不會影響結果

explain select * from test where c1='a1' and c2='a2' and c5='c5' order by c3,c2;

# 通過這麼多order by案例,一般情況order by沒有按照索引順序排序,會出現filesort。但是,c2在前面索引查詢已經是const常量,索引不會出現filesort

explain select * from test where c1='a1' and c4='a4' group by c2,c3;

explain select * from test where c1='a1' and c4='a4' group by c3,c2;

# 首先知道的是分組之前必須進行排序。

# 第乙個例子:使用了c1索引,索引未完全失效。

# 第二個例子:group by 後索引順序顛倒,出現了filesort和temporary,產生臨時表。

explain select * from test where c1='a1' and c2 like 'kk%' and c3='c3';

# 用到了c1,c2,c3,有人會疑問c2使用索引為範圍排序,會導致c3失效,但是c2以常量開頭,這樣不會導致c3索引失效。

explain select * from test where c1='a1' and c2 like '%kk' and c3='c3';

# 只用到了c1索引。c2以%開頭失效,c3根本沒有**到

explain select * from test where c1='a1' and c2 like 'k%kk%' and c3='c3';

# 用到了c1,c2,c3 與案例一樣。

mysql牽引例子 MySQL索引一些常用案例

索引案例分析 先建立一些假資料 create table test03 id int primary key not null auto increment,c1 char 10 c2 char 10 c3 char 10 c4 char 10 c5 char 10 insert into test...

mysql一些常用語句 mysql一些常用語句

一 從命令列登入mysql資料庫伺服器 1 登入使用預設3306埠的mysql usr local mysql bin mysql u root p 2 通過tcp連線管理不同埠的多個mysql 注意 mysql4.1以上版本才有此項功能 usr local mysql bin mysql u ro...

mysql索引技巧 MySql 索引的一些技巧

一 多表子從查詢 多表查詢時,子查詢可能會出現觸發不了索引的情況 select from test 1 where id in select id from test publish where id in 38,69 上面語句,test 1和test public都where了主鍵id,常理來說這...