mysql查詢優化explain命令詳解

2021-09-20 07:35:33 字數 2199 閱讀 2897

​mysql查詢優化的方法有很多種,explain是工作當中用的比較多的一種檢查方式。explain翻譯即解釋,就是看mysql語句的查詢解釋計畫,從解釋計畫我們能很清楚的看到解釋的語句有沒有合理用到索引,掃瞄了多少行數,有沒有觸及全表掃瞄、用到臨時表等影響慢查詢的原因。

使用很簡單,如

explainselect * from user ...

執行後會出現解釋計畫的**,意義可參考下面的引數,針對這些解釋計畫,我們可以作為相對應的優化。

idmysql查詢識別符號,即序號。

select_type查詢型別

******:即簡單select 查詢,不包含union及子查詢;

primary:最外層的 select 查詢;

union:表示此查詢是 union 的第二或隨後的查詢;

dependent union:union 中的第二個或後面的查詢語句, 取決於外面的查詢;

union result:union的結果;

subquery:子查詢中的第乙個select;

dependent subquery:子查詢中的第乙個select,取決於外面的查詢,即子查詢依賴於外層查詢的結果。

table所有查詢到的表。

type聯接型別,比較重要的項,從這一項可以看出是否高效的重要依據

效能從好到壞依次如下:

system:表中只有一條資料,這是乙個特殊的const 型別;

const:針對主鍵或唯一索引的等值查詢掃瞄,最多隻返回一行資料,const 查詢速度非常快,因為它僅僅讀取一次即可;

eq_ref:此型別通常出現在多表的 join 查詢,表示對於前表的每乙個結果,都只能匹配到後表的一行結果,並且查詢的比較操作通常是=, 查詢效率較高;

ref:此型別通常出現在多表的 join 查詢, 針對於非唯一或非主鍵索引, 或者是使用了 最左字首 規則索引的查詢;

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

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

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

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

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

range:表示使用索引範圍查詢,通過索引字段範圍獲取表中部分資料記錄。這個型別通常出現在 =, <>, >, >=, <, <=, is null, <=>, between, in操作中,此時輸出的 ref 欄位為 null並且key_len欄位是此次查詢中使用到的索引的最長的那個;

index:全表掃瞄,只是掃瞄表的時候按照索引次序進行而不是行。主要優點就是避免了排序,但是開銷仍然非常大,這種情況時, extra 欄位會顯示 using index;

all:效能最差的情況,使用了全表掃瞄,系統必須避免出現這種情況。

possible_keys可能用到的索引。

key真正用到的索引。

key_len使用了索引位元組的長度。

ref顯示索引的哪一列被使用了。

rows掃瞄了多少行數,也是效能評估的重要依據。

extra額度資訊,常見的有以下幾種。

distinct:一旦找到了與行相聯合匹配的行就不再搜尋了;

using filesort:使用了檔案排序,效能非常慢,需要優化。

using index:查詢使用到了索引,列資料是從僅僅使用了索引中的資訊而沒有讀取實際的行動的表返回的,這發生在對錶的全部的請求列都是同乙個索引的部分的時候。

using temporary:使用了臨時表排序,效能非常慢,需要優化。

using where:表示使用了where進行查詢,不是很重要。

all:這個連線型別對於前面的每乙個記錄聯合進行完全掃瞄,這一般比較糟糕,需要優化。

擴充套件

另外,mysql5.6增加了對insert/update/delete的explain支援,用法一樣。

MySQL學習14 查詢分析器explain

分析出表的讀取順序 資料讀取操作的操作型別 哪些索引可以使用 哪些索引被實際使用 表之間的引用 每張表有多少行被優化器查詢。引數描述 id執行select子句或操作表的順序 select type 查詢的型別,如 primary subquery derived union等 table 當前行使用...

查詢優化(MySQL優化查詢)

關聯查詢太多join 設計缺陷或不得已的需求 資料庫伺服器調優及各個引數設定不適當 緩衝 執行緒數等 慢查詢日誌 找出執行速度慢的sql語句 慢查詢的開啟並捕獲 explain 慢sql分析 show profile查詢sql在mysql伺服器裡面的執行細節和生命週期情況 sql資料庫伺服器的引數調...

mysql統計查詢優化 Mysql查詢優化

效能涉及的層面很多,但是在操作層面,主要有表結構設計優化 索引優化和查詢優化 查詢的生命週期大致可以分為,從客戶端 到服務端 在伺服器上解析 生成執行計畫 執行 返回結果給客戶端 sql執行流程 具體優化技巧 1.消除外連線 2.消除子查詢 盡量用join代替子查詢,雖說mysql查詢優化器會進行優...