MySql學習之效能分析Explain使用

2021-08-07 10:27:20 字數 4359 閱讀 1811

1、mysql query optimizer 查詢優化器

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

當客戶端向mysql請求一條query,命令解析器模組完成請求分類,區別出是select並**給mysql query optimizer時,mysql query optimizer首先對整條query進行優化,處理掉一些常量表示式的預算,直接換算成常量值。並對query中的查詢條件進行簡化和轉換,如去掉一些無用或顯而易見的條件、結構調整等。然後分析query中的hint資訊(如果有),看顯示hint資訊是否可以完全確認該query的執行計畫。如果沒有hint或hint資訊還不足以完全確定執行計畫,則會讀取所涉及物件的統計資訊,根據query進行寫相對應的計算分析,然後再得出最後的執行計畫。

2、mysql常見瓶頸

(1)cpu:cpu在飽和的時候一般發生在資料裝入記憶體或從磁碟上讀取資料的時候。

(2)io:磁碟i/o瓶頸發生在裝入資料遠大於記憶體容量的時候。

(3)伺服器硬體的效能瓶頸:top、free、iostat和vmstat來檢視系統的效能狀態。

3、explain簡介

使用explain關鍵字可以模擬優化器執行sql查詢語句,從而知道mysql是如何處理你的sql語句的。分析查詢語句或是表結構的效能瓶頸。

4、explain使用

explain + sql

5、包含的資訊

6、id(順序號)、table(表名)

(1)select查詢的序列號,包含一組數字,表示查詢中執行select子句或表的順序。

(2)三種情況

①id相同,執行順序由上至下。

id相同,執行順序t1、t2、t3。
②id不同,如果是子查詢,id的序號會遞增,id值越大優先順序越高,越先被執行。

id不同,id值越大越先被執行,執行順序t3、t1、t2。
③id相同、不同,同時存在。

id相同、不同,執行順序t3、derived2、t2。
7、select_type查詢型別

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

(2)primary:查詢中若包含任何複雜的子部分,最外層查詢則被標記為primary。

(3)subquery:在select或where列表中包含了子查詢。

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

(5)union:若第二個select出現在union之後,則被標記為union,若union包含在from子句的子查詢中,外層select將被標記為deriver。

(6)union result:從union表獲取結果的select(兩個union查詢合併的結果)。

8、type

顯示的是訪問型別,是較為重要的乙個指標。

(1)system:表只有一行記錄(等於系統表),這個const型別的特列,平時不會出現,可以忽略不計。

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

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

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

(5)fulltext:全文索引檢索,要注意,全文索引的優先順序很高,若全文索引和普通索引同時存在時,mysql不管代價,優先選擇使用全文索引。

(6)ref_or_null:與ref方法類似,只是增加了null值的比較。實際用的不多。

(7)index_merge:表示查詢使用了兩個以上的索引,最後取交集或者並集,常見and ,or的條件使用了不同的索引,官方排序這個在ref_or_null之後,但是實際上由於要讀取所個索引,效能可能大部分時間都不如range

(8)unique_subquery:用於where中的in形式子查詢,子查詢返回不重複值唯一值

(9)index_subquery:用於in形式子查詢使用到了輔助索引或者in常數列表,子查詢可能返回重複值,可以使用索引將子查詢去重。

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

(11)index:full index scan,index與all區別為index型別只遍歷索引數。這通常比all快,因為索引檔案通常比資料檔案小(也就是說雖然all和index都是讀全表,但是index是從索引中讀取,而all是從硬碟中讀取)。

(12)all:full table scan,將遍歷全表以找到匹配的行。

結果值從最好到最壞依次是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > all

簡化後(常用)為:system > const > eq_ref > ref > range > index > all

一般來說,得保證查詢至少達到range級別,最好能達到ref。

9、possible_key、key和key_len

possible_keys:查詢可能使用到的索引都會在這裡列出來,但不一定被查詢實際使用。

key:查詢真正使用到的索引,如果為空,則沒有使用索引。查詢中若出現覆蓋索引,則該索引會出現在key列表中。select_type為index_merge時,這裡可能出現兩個以上的索引,其他的select_type這裡只會出現乙個。

key_len:表示索引中使用的位元組數,可通過該列計算查詢中使用的索引長度。在不損失精確性的情況下,長度越短越好。key_len顯示的值為索引欄位的最大可能長度,並非實際使用長度,即key_len是根據表定義計算而得,不是通過表內檢索所得。

10、ref和rows

ref:如果是使用的常數等值查詢,這裡會顯示const,如果是連線查詢,被驅動表的執行計畫這裡會顯示驅動表的關聯字段,如果是條件使用了表示式或者函式,或者條件列發生了內部隱式轉換,這裡可能顯示為func。

rows:根據表統計資訊及索引選用情況,大致估算出找到所需的記錄所需要讀取的行數,不是精確值。數值越小越好。

11、extra

包含不適合在其他列中顯示但十分重要的額外資訊。

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

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

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

(4)using where:表明使用了where過濾。

(5)using join buffer:表明使用了連線快取。

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

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

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

mysql 效能分析 Mysql效能分析

優化mysql資料庫效能的十個引數 1 max connections 允許的同時客戶的數量。增加該值增加 mysqld 要求的檔案描述符的數量。這個數字應該增加,否則,你將經常看到 too many connections 錯誤。預設數值是100,我把它改為1024 2 record buffer...

mysql效能分析方法 mysql 效能分析方法

1.explain分析法 explain 分析查詢語句 1 id列數字越大越先執行,如果說數字一樣大,那麼就從上往下依次執行 2 select type查詢型別 primary dependent subquery等 3 table表名 4 type 從上到下效能依次下降 system 表中只有一行...

mysql 效能分析 mysql效能分析工具

一 expalin 在sql語句之前加上explain關鍵字就可以獲取這條sql語句執行的計畫 那麼返回的這些欄位是什麼呢?我們先關心一下比較重要的幾個字段 1.select type 查詢型別 1 簡單查詢,沒有union和子查詢 2 priamry 主查詢,有union或子查詢的最外層查詢 3 ...