《mysql學習》 explain執行計畫

2021-08-11 02:10:32 字數 3584 閱讀 1574

參考:mysql執行計畫解讀

使用explain檢視,盡量優化sql使rows盡量小,因為查詢的時候會對資料行加鎖,所以rows越小代表鎖的行越少

id

select_type

table

type

possible_keys

keykey_len

refrows

extra

1******

spall

null

null

null

null

3613155

using where

mysql選定的執行計畫中查詢的序列號。如果語句裡沒有子查詢等情況,那麼整個輸出裡就只有乙個select,這樣一來每一行在這個列上都會顯示乙個1。如果語句中使用了子查詢、集合操作、臨時表等情況,會給id列帶來很大的複雜性。如果where部分使用了子查詢,其id=2的行表示乙個關聯子查詢。

語句所使用的查詢型別。是簡單select還是複雜select(如果是後者,顯示它屬於哪一種複雜型別)。常用有以下幾種標記型別。

primary

子查詢中的最外層查詢,注意並不是主鍵查詢。

******

簡單查詢,即沒有使用聯合或者子查詢

uncacheable subquery

結果集無法快取的子查詢。

union

union語句中的第二個select開始後面的所有select,第乙個select為primary。

dependent union

子查詢中的union,且為union中從第二個select開始的後面所有select,同樣依賴於外部查詢的結果集。

union result

union 中的合併結果。從union 臨時表獲取結果的select。

subquery

子查詢內層查詢的第乙個select,結果不依賴於外部查詢結果集。

dependent subquery

子查詢內層的第乙個select,依賴於外部查詢的結果集。

derived

衍生表查詢(from子句中的子查詢)。mysql會遞迴執行這些子查詢,把結果放在臨時表裡。在內部,伺服器就把當做乙個」衍生表」那樣來引用,因為臨時表就是源自子查詢。

這一步所訪問的資料庫中表的名稱或者sql語句指定的乙個別名表。這個值可能是表名、表的別名或者乙個為查詢產生的臨時表的識別符號,如派生表、子查詢或集合。

阿里sql 效能優化的目標:至少要達到 range 級別,要求是 ref 級別,如果可以是 consts最好。說明:1 )

表的訪問方式。以下列出了各種不同型別的表連線,依次是從最好的到最差的。

system

系統表,表只有一行記錄。這是const表連線型別的乙個特例。

const

表中最多只有一行匹配的記錄。讀常量,由於只有一行記錄,優化程式裡該行記錄的字段值可以被當作是乙個常量,僅在查詢開始時讀取一次。當primary key或unique索引與常量進行比較時會顯示const,速度非常快

eq_ref

類似const,const比較的是常量,eq_ref是同另一張表中的字段關聯比較,這是最好的連線型別。eq_ref出現在primary key或unique型別索引進行」=」做比較時檢索字段。比較的值可以是固定值或者是表示式,表達示中可以使用表裡的字段。

ref查詢時的索引型別不是primary key或unique型別索引導致匹配到的行有多個,或者僅能用到索引的左字首而非全部時的訪問型別。ref可被用於基於索引字段進行 - 或 <=> 操作

ref_or_null

與ref的唯一區別就是在使用索引引用的查詢之外再增加乙個空值的查詢。這種連線型別類似ref,不同的是mysql會在檢索的時候額外的搜尋包含null值的記錄,它經常用於子查詢。

index_merge

查詢中同時使用兩個(或更多)索引,然後對索引結果進行合併(merge),再讀取表資料。這種連線型別意味著使用了index merge優化方法。

unique_subquery

子查詢中的返回結果字段組合是主鍵或唯一約束。用於in比較操作符中的子查詢錦繡谷的「鍵值唯一」的訪問型別場景中,如value in (select primary_key from table where x = x)

index_subquery

子查詢中的返回結果字段組合是乙個索引(或索引組合),但不是乙個主鍵或唯一索引。這種連線型別類似unique_subquery。它用子查詢來代替in,不過它用於在子查詢中沒有唯一索引的情況下。

range

索引範圍掃瞄。只有在給定範圍的記錄才會被取出來,利用索引來取得一條記錄。常見於between、<、>等的查詢

index

全索引掃瞄。連線型別跟all一樣,不同的是它只掃瞄索引樹。它通常會比all快點,因為索引檔案通常比資料檔案小。mysql在查詢的字段只是單獨的索引的一部分的情況下使用這種連線型別。

fulltext

用於full text索引中用純文字匹配的方法來檢索記錄

all全表掃瞄。

該字段是指mysql在搜尋表記錄時可能使用哪個索引。如果沒有任何索引可以使用,就會顯示為null。

查詢時只能使用乙個索引,查詢優化器從possible_keys中所選擇使用的索引。key欄位顯示了mysql實際上要用的索引。當沒有任何索引被用到的時候,這個欄位的值就是null。

被選中使用索引的索引鍵長度。key_len欄位顯示了mysql使用索引的長度。當key欄位的值為null時,索引的長度就是null。

列出是通過常量,還是某個表的某個欄位來過濾的。ref欄位顯示了哪些字段或者常量被用來和key配合從表中查詢記錄出來。

該欄位顯示了查詢優化器通過系統收集的統計資訊估算出來的結果集記錄條數。

該欄位顯示了查詢中mysql的附加資訊。

using where

mysql伺服器將在儲存引擎收到資料後進行後過濾;如果where條件中使用了索引列,其讀取索引時就由儲存引擎檢查,因此並非所有帶有where子句的查詢都會顯示using where

using index

表示所需要的資料從索引中就能夠全部獲取到,而不需要再次從表中查詢資料,這意味著mysql將使用覆蓋索引,但如果同時還出現了using where,則表示索引將被用於查詢特定的鍵值

using index for group-by

類似using index,它表示mysql可僅通過索引中的資料完成group by或distinct操作

using filesort

表示mysql會對結構使用乙個外部索引排序,而不是從表裡按索引次序來讀取行

mysql學習筆記 explain的用法

1.explain的使用方法 mysql中的explain命令顯示了mysql如何使用索引來處理select語句以及連線表。使用時直接在select語句前加上explain就行了。例子如下 explain select from orders 執行結果如下 建立索引後的執行結果如下 每列的解釋 1 ...

MySql學習之效能分析Explain使用

1 mysql query optimizer 查詢優化器 mysql中有專門負責優化select語句的優化器模組,主要功能 通過計算分析系統中收集到的統計資訊,為客戶端請求的query提供他認為最優的執行計畫 他認為最優的資料檢索方式,但是不見得是dba認為是最優的,這部分最消耗時間 當客戶端向m...

Mysql效能分析 Explain

一.explain是什麼 使用explain關鍵字可以模擬優化器執行sql查詢語句,從而知道mysql是 如何處理你的sql語句的。分析你的查詢語句或是表結構的效能瓶頸 二.explain作用 1 表的讀取順序 2 哪些索引可以使用 3 資料讀取操作的操作型別 4 哪些索引被實際使用 5 表之間的引...