mysql問題和理解

2021-08-14 10:48:39 字數 3881 閱讀 4063

參考文章: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

選項a
mysql> 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)

選項b
mysql> 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)

選項c
mysql> 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 *,因為如果將所有字段一起做索引會導致索引檔案過大,查詢效能下降

選項d
mysql> 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)

選項e
mysql> 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...