MySQL效能優化 explain詳解

2021-09-25 05:55:37 字數 2608 閱讀 1669

參考:【mysql優化】——看懂explain

explain關鍵字可以模擬優化器執行sql,從而知道mysql是如何處理sql語句,分析查詢語句或者表結構的效能瓶頸。mysql5.6版本後,select、update、delete、insert都可以使用explain檢視執行計畫。

示例:

字段資訊說明:

id

查詢的序號,包含一組數字,表示查詢中執行select子句或操作表的順序。

select_type

查詢型別,主要用於區別普通查詢,聯合查詢,子查詢等的複雜查詢

******:簡單的select查詢,查詢中不包含子查詢或者union

primary:包含子查詢或者聯合查詢,最外層標識為primary

subquery:在select或where列表中包含了子查詢

derived:在from列表中包含的子查詢被標記為derived(衍生),mysql會遞迴執行這些子查詢,把結果放到臨時表中

union——如果第二個select出現在union之後,則被標記為union,如果union包含在from子句的子查詢中,外層select被標記為derived

union result:union 的結果

table

輸出的行所引用的表

type

顯示聯結型別,顯示查詢使用了何種型別,按照從最佳到最壞型別排序

system:表中僅有一行(=系統表)這是const聯結型別的乙個特例

const:表示通過索引一次就找到,const用於比較primary key或者unique索引。因為只匹配一行資料,所以如果將主鍵置於where列表中,mysql能將該查詢轉換為乙個常量

eq_ref:唯一性索引掃瞄,對於每個索引鍵,表中只有一條記錄與之匹配。常見於唯一索引或者主鍵掃瞄

ref:非唯一性索引掃瞄,返回匹配某個單獨值的所有行,本質上也是一種索引訪問,它返回所有匹配某個單獨值的行,可能會找多個符合條件的行,屬於查詢和掃瞄的混合體

range:只檢索給定範圍的行,使用乙個索引來選擇行。key列顯示使用了哪個索引,一般就是where語句**現了between,in等範圍的查詢。這種範圍掃瞄索引掃瞄比全表掃瞄要好,因為它開始於索引的某乙個點,而結束另乙個點,不用全表掃瞄

index:index與all區別為index型別只遍歷索引樹。通常比all快,因為索引檔案比資料檔案小很多。

all:遍歷全表以找到匹配的行

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > all

注意:一般保證查詢至少達到range級別,最好能達到ref

possible_keys指出mysql能使用哪個索引在該表中找到行

key

顯示mysql實際決定使用的鍵(索引)。如果沒有選擇索引,鍵是null。查詢中如果使用覆蓋索引,則該索引和查詢的select欄位重疊。

key_len

表示索引中使用的位元組數,該列計算查詢中使用的索引的長度在不損失精度的情況下,長度越短越好。如果鍵是null,則長度為null。該欄位顯示為索引欄位的最大可能長度,並非實際使用長度。

ref

顯示索引的哪一列被使用了,可能是乙個常數const,哪些列或常量被用於查詢索引列上的值

rows

根據表統計資訊以及索引選用情況,大致估算出找到所需的記錄所需要讀取的行數

extra

該列包含mysql解決查詢的詳細資訊

using filesort:說明mysql會對資料適用乙個外部的索引排序。而不是按照表內的索引順序進行讀取。mysql中無法利用索引完成排序操作稱為「檔案排序」

using temporary:使用了臨時表儲存中間結果,mysql在查詢結果排序時使用臨時表。常見於排序order by和分組查詢group by。

using index:表示相應的select操作用使用覆蓋索引,避免訪問了表的資料行。如果同時出現using where,表明索引被用來執行索引鍵值的查詢;如果沒有同時出現using where,表名索引用來讀取資料而非執行查詢動作。

using where :表明使用where過濾

using join buffer:使用了連線快取

impossible where:where子句的值總是false,不能用來獲取任何元組

select tables optimized away:在沒有group by子句的情況下,基於索引優化min、max操作或者對於myisam儲存引擎優化count(*),不必等到執行階段再進行計算,查詢執行計畫生成的階段即完成優化。

distinct:優化distinct操作,在找到第一匹配的元組後即停止找同樣值的動作。

mysql效能優化 mysql效能優化

優化方式 1.空間換時間 冗餘 2.時間換空間 字段優先使用型別 int date char varchar text 索引型別 btree索引 hash索引 索引的葉子下,存放乙個資訊指向所在行的資料位址。btree有利於範圍查詢,hash有利於精確查詢。btree用的更多一些。btree索引的常...

mysql的效能優化 mysql效能優化

檢視安裝指令碼 select version 非互動式超時時間,如jdbc show global variables like wait timeout 互動式超時時間,如資料庫工具 show global variables like interactive timeout show sessi...

mysql 效能優化 命令 mysql效能優化

發現問題 當發現程式執行比較慢的時候,首先排除物力資源問題之後,就將注意力轉向mysq資料庫 1 首先確定執行慢的sql語句 mysql show full processlist 2 確認低效的查詢 多次執行第一步發現time耗費大的sql語句。檢視耗費的時間。3 分析效能 為sql生成乙個執行計...