mysql 學習與提高5 explain命令詳解

2021-08-30 21:54:23 字數 3176 閱讀 9410

目錄

explain 簡介

explain 使用

explain 字段

1. id欄位

2.select_type

3.table

4.type

5.possible_keys

6.key

7.key_len

8.ref

9.rows

10.extra

注意事項

explain 提供了 mysql 如何執行 sql 語句的資訊,通過這些資訊,可以對 sql 語句做相應的優化,提高執行效率。

呼叫 explain,只需要在 sql 語句前新增 explain 關鍵字即可。

一般情況下,新增 explain 關鍵字後,認為 mysql 不會執行查詢,但是如果在 from 子句中包含子查詢,那麼 mysql 實際上會執行子查詢,將其子查詢的結果放在乙個臨時表中,然後完成外層查詢優化。

mysql 5.6 之前的版本,只允許解釋 select 語句,從 mysql 5.6 開始,非 select 語句也可以被解釋了。
呼叫 explain 後,mysql 會返回一行或者多行記錄,通過這些記錄就可以知道 sql 語句的執**況了。

例如:執行語句

explain select * from student where name = 'bill'
每行記錄都包含了以下幾個字段

接下來我們逐個進行講解

注意:我們發現,表的執行順序會因為表中資料的個數改變而改變,這是什麼原因呢?

假設我們有 a(4)  b(3)  c(3)三種表,括號內的是其資料個數。

當執行語句 select * from a,b,c時

若執行順序為  b--- c--- a  時,根據笛卡爾積  3 * 2 = 6 * 4 = 24 ,中間結果 6 需要占用儲存空間進行儲存

若執行順序為  a--- b--- c  時,根據笛卡爾積  4 * 3 =12 * 2 = 24 ,中間結果12需要占用儲存空間進行儲存

這兩種最後的執行結果是一樣的,但是前一種順序比後一種順序的中間結果更小,意味著需要更小的儲存空間,所以mysql會自動對錶的執行順序進行調整,資料少的表先查詢。

select_type表示了查詢的型別,它的常用取值有

表示查詢涉及的表或衍生表

//執行如下多表查詢

該列稱為關聯型別或者訪問型別,它指明了 mysql 決定如何查詢表中符合條件的行,同時為判斷查詢是否高效提供了重要的依據。

以下為常見的取值

該列取不同值的執行效率依次是

all < index < range < ref < eq_ref < const < system < null

其中:system,const只是理想情況;實際能達到 ref>range

index 和 all的區別

index:查詢全部索引中資料

explain select tid from teacher ; --tid 是索引, 只需要掃瞄索引表,不需要所有表中的所有資料

all:查詢全部表中的資料

explain select cid from course ; --cid不是索引,需要全表所有,即需要所有表中的所有資料

表示 mysql 在查詢時, 能夠使用到的索引. 注意, 即使有些索引在 possible_keys 中出現, 但是並不表示此索引會真正地被 mysql 使用到. mysql 在查詢時具體使用了哪些索引, 由 key 字段決定.

此字段是 mysql 在當前查詢時所真正使用到的索引.

索引的長度 ;一般用於判斷復合索引是否被完全使用  (a,b,c)。

eg:先增加乙個表,並把name設為索引

create table test_kl

( name char(20) not null default ''

);alter table test_kl add index index_name(name) ;

執行explain語句

這個60是怎麼算的呢? 其實是60 = 20 * 3這樣得來的, 20表示每個name佔20個字元,3表示在utf8中1個字元站3個位元組,所以  便得到了我們的60

我們繼續在原來的基礎上再增加乙個不為空的name1欄位,並設定為索引

alter table test_kl add column name1 char(20) ;  --name1可以為null

此時ken_len為61,是因為如果索引字段可以為null,則會使用1個位元組用於標識。 

key_len的計算規則如下:

數值型別:

時間型別

字段屬性: null 屬性 占用乙個位元組. 如果乙個欄位是 not null 的, 則沒有此屬性.

注意與type中的ref值區分。作用: 指明當前表所 參照的 字段。

select ....where a.c = b.x ;(其中b.x可以是常量,const)

rows 也是乙個重要的字段. mysql 查詢優化器根據統計資訊, 估算 sql 要查詢到結果集需要掃瞄讀取的資料行數.

這個值非常直觀顯示 sql 的效率好壞, 原則上 rows 越少越好.

該列顯示了有關 mysql 如何解析查詢的其它資訊。

以下為常見的取值

mysql學習與提高1 mysql架構總覽

我們先下圖看看mysql整體邏輯架構 mysql s logical architecture 圖1第二層值得關注。這是mysql的核心部分。通常叫做 sql layer。在 mysql據庫系統處理底層資料之前的所有工作都是在這一層完成的,包括許可權判斷,sql解析,行計畫優化,query cach...

MYSQL學習(5)約束

1.約束保證資料的完整性和一致性 2.約束分為表級約束和列級約束 3.約束型別包括 not null 非空約束 primary key 主鍵約束 dunique key 唯一約束 default 預設約束 foreign key 外界約束 4.foreign key 外界約束 要求 1.父表和子表必...

Mysql學習隨筆 5

1.主鍵 不能重複 不能為空 索引 一張表只能有乙個主鍵 乙個主鍵可以是多列 2.外來鍵 約束不重複 可以為空 節省空間 加速查詢 3.外來鍵例項 create table t5 nid int 11 not null auto increment,pid int 11 not null,num i...