參考文章:mysql的索引型別和左字首索引,這裡寫鏈結內容,explain 命令詳解
假設某個表有乙個聯合索引(c1,c2,c3,c4)一下——只能使用該聯合索引的c1,c2,c3部分
a where c1=x and c2=x and c4>x and c3=x
b where c1=x and c2=x and c4=x order
by c3
c where c1=x and c4= x group
by c3,c2
d where c1=?
and c5=?
order
by c2,c3
e where c1=?
and c2=?
and c5=?
order
by c2,c3
有誰知道下面a-e能否可以使用索引!!為什麼?
語句
area where c1=x and c2=x and c4>x and c3=x
使用了c1,c2,c3,c4
b where c1=x and c2=x and c4=x order by c3
使用了c1,c2。沒用上c3,c4
c where c1=x and c4= x group by c3,c2
使用了c1。沒用上c2,c3,c4
d where c1=? and c5=? order by c2,c3
使用了c1。沒用上c2,c3,c4
e where c1=? and c2=? and c5=? order by c2,c3
使用了c1,c2,c3。沒用上c4
create
table t4 (
c1 tinyint(1) not
null
default
0, c2 tinyint(1) not
null
default
0, c3 tinyint(1) not
null
default
0, c4 tinyint(1) not
null
default
0, c5 tinyint(1) not
null
default
0, index c1234(c1,c2,c3,c4)
);insert
into t4 values (1,3,5,6,7),(2,3,9,8,3),(4,3,2,7,5);
mysql版本5.6.17
選項amysql> explain select * from t4 where c1=1 and c2=2 and c4>4 and c3=3\g
*****
*****
*****
*****
*****
** 1. row **
*****
*****
*****
*****
*****
id: 1
select_type: ******
table: t4
type: range
possible_keys: c1234
key: c1234
key_len: 4
ref: null
rows: 1
extra: using index condition
1 row in set (0.00 sec)
選項bmysql> explain select * from t4 where c1=1
and c2=2
and c4=3
order
by c3\g
*************************** 1. row ***************************
id: 1
select_type: ******
table: t4
type: ref
possible_keys: c1234
key: c1234
key_len: 2
ref: const,const
rows: 1
extra: using
index condition; using
where
1 row in
set (0.00 sec)
選項cmysql> explain select * from t4 where c1=1
and c4=3
group
by c3,c2\g
*************************** 1. row ***************************
id: 1
select_type: ******
table: t4
type: ref
possible_keys: c1234
key: c1234
key_len: 1
ref: const
rows: 1
extra: using
index condition; using
where; using temporary; using fileso
rt1 row in
set (0.00 sec)
using
index,該值表示相應的select操作中使用了覆蓋索引(covering index)
mysql可以利用索引返回select列表中的字段,而不必根據索引再次讀取資料檔案
包含所有滿足查詢需要的資料的索引稱為覆蓋索引(covering index)
注意:如果要使用覆蓋索引,一定要注意select列表中只取出需要的列,不可select *,因為如果將所有字段一起做索引會導致索引檔案過大,查詢效能下降
選項dmysql> explain select * from t4 where c1=1
and c5=3
order
by c2,c3\g
*************************** 1. row ***************************
id: 1
select_type: ******
table: t4
type: ref
possible_keys: c1234
key: c1234
key_len: 1
ref: const
rows: 1
extra: using
where
1 row in
set (0.00 sec)
選項emysql> explain select * from t4 where c1=1
and c2=2
and c5=3
order
by c2,c3\g
*************************** 1. row ***************************
id: 1
select_type: ******
table: t4
type: ref
possible_keys: c1234
key: c1234
key_len: 2
ref: const,const
rows: 1
extra: using
where
1 row in
set (0.00 sec)
MySQL效能問題理解
備註 問題摘抄自慕課網張一勤老師 為什麼 group by 的效率比較低?group by 是將資料分組,這其中實際也會涉及到排序的操作。如果你的資料量很大,那麼,這個排序過程可能是非常慢的。所以,排序的過程會降低 sql 語句的執行效率。將資料全量查出,在程式中處理,這樣好嗎?這樣肯定是不合適的。...
mysql理解 理解MySQL(一)MySQL介紹
1 第一層 連線 執行緒處理 2 第二層 mysql的核心服務功能,包括查詢解析 分析 優化和快取,所有跨儲存引擎的功能都在這一層實現 3 第三層 儲存引擎。儲存引擎負責mysql中資料的儲存和提取。二 併發控制 1 讀寫鎖 在處理併發讀或者寫時,可以通過實現乙個由兩種型別的鎖組成的鎖系統來解決這個...
MySQL對group by原理和理解
突然感覺group by好陌生,總有個筋別不過來,為什麼不能夠select from table group by id,為什麼一定不能是 而是某乙個列或者某個列的聚合函式,group by 多個字段可以怎麼去很好的理解呢?正文開始 先來看下表1,表名為test 表1執行如下sql語句 select...