查詢優化神器 explain命令

2021-08-18 11:12:40 字數 2798 閱讀 2667

關於explain命令相信大家並不陌生,具體用法和字段含義可以參考官網explain-output,這裡需要強調rows是核心指標,絕大部分rows小的語句執行一定很快。所以優化語句基本上都是在優化rows。

1. 慢查詢優化基本步驟

1.   先執行看看是否真的很慢,注意設定sql_no_cache

2.   where條件單錶查,鎖定最小返回記錄表。這句話的意思是把查詢語句的where都應用到表中返回的記錄數最小的表開始查起,單錶每個字段分別查詢,看哪個欄位的區分度最高

3.   explain檢視執行計畫,是否與1預期一致(從鎖定記錄較少的表開始查詢

4.   order by limit 形式的sql語句讓排序的表優先查

5.   了解業務方使用場景

6.   加索引時參照建索引的幾大原則

7.   觀察結果,不符合預期繼續從0分析

2. explain具體解釋

explain的結果一共有10項,分別是

id,  selecttype,  table,  type, possible_keys,  key,  key_len, ref, rows, extra

selecttype(

查詢型別

)1.      ****** 它表示簡單的select,沒有union和子查詢

2.     primary 最外面的select,在有子查詢的語句中,最外面的select查詢就是primary

3.     union union語句的第二個或者說是後面那乙個

key_len

(位元組長度)

1.      索引欄位的附加資訊:可以分為變長和定長資料型別討論,當索引欄位為定長資料型別,比如char,int,datetime,需要有是否為空的標記,這個標記需要占用1個位元組;對於變長資料型別,比如:varchar,除了是否為空的標記外,還需要有長度資訊,需要占用2個位元組;(備註:當欄位定義為非空的時候,是否為空的標記將不占用位元組)

2.      同時還需要考慮表所使用的字符集,不同的字符集,gbk編碼的為乙個字元2個位元組,utf8編碼的乙個字元3個位元組;

3.      特別注意這個值可以得出乙個多重主鍵裡mysql實際使用了哪一部分。

type(

連線型別。有多個引數,先從最佳型別到最差型別介紹重要且困難)

一般來說,得保證查詢至少達到range級別,最好能達到ref,否則就可能會出現效能問題。

1.      const 表最多有乙個匹配行,const用於比較primarykey 或者unique索引(一般可以理解為const是最優化)

2.     eq_ref 使用有唯一性索引查詢(主鍵或唯一性索引)

對於每個來自於前面的表的行組合,從該表中讀取一行。這可能是最好的聯接型別,除了const型別。它用在乙個索引的所有部分被聯接使用並且索引是unique或primary key

3.     ref非唯一性索引訪問

例如:(例如:select id from tablename where name='jay' name不是唯一索引)

對於每個來自於前面的表的行組合,所有有匹配索引值的行將從這張表中讀取。如果聯接只使用鍵的最左邊的字首,或如果鍵不是unique或primary key(換句話說,如果聯接不能基於關鍵字選擇單個行的話),則使用ref。如果使用的鍵僅僅匹配少量行,該聯接型別是不錯的

4.     ref_or_null 該聯接型別如同ref,但是新增了mysql可以專門搜尋包含null值的行。在解決子查詢中經常使用該聯接型別的優化。

上面這五種情況都是很理想的索引使用情況。

5.     index_merge

6.     unique_subquery 

7.     range 給定範圍內的檢索,使用乙個索引來檢查行;索引範圍掃瞄,常用語<,<=,>=,between等操作

例如:select id from tablename where id>100;

8.     index

按索引次序掃瞄表,就是先讀索引,再讀實際的行,其實還是全表掃瞄。主要優點是避免了排序,因為索引是排好序的。(例如:select name from tablename)

該聯接型別與all相同,除了只有索引樹被掃瞄。這通常比all快,因為索引檔案通常比資料檔案小。(也就是說雖然all和index都是讀全表,但index是從索引中讀取的,而all是從硬碟中讀的)當查詢只使用作為單索引一部分的列時,mysql可以使用該聯接型別。

9.     all 對於每個來自於先前的表的行組合,進行完整的表掃瞄。如果表是第乙個沒標記const的表,這通常不好,並且通常在它情況下差。通常可以增加更多的索引而不要使用all,使得行能基於前面的表中的常數值或列值被檢索出。

refref

列顯示使用哪個列或常數與

key一起從表中選擇行。

rows顯示

mysql

執行查詢的行數,簡單且重要,數值越大越不好,說明沒有用好索引

extra該列包含

mysql

解決查詢的詳細資訊。

1.using index 只使用索引樹中的資訊而不需要進一步搜尋讀取實際的行來檢索表中的資訊。這個比較容易理解,就是說明是否使用了索引

2.using temporary 為了解決查詢,mysql需要建立乙個臨時表來容納結果。典型情況如查詢包含可以按不同情況列出列的groupby和order by子句時。出現usingtemporary就說明語句需要優化了

mysql查詢優化explain命令詳解

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

MySQL查詢優化語句 explain

一 mysql 查詢優化器是如何工作的 mysql 查詢優化器有幾個目標,但是其中最主要的目標是盡可能地使用索引,並且使用最嚴格的索引來消除盡可能多的資料行。最終目標是提交 select 語句查詢資料行,而不是排除資料行。優化器試圖排除資料行的原因在於它排除資料行的速度越快,那麼找到與條件匹配的資料...

查詢優化之EXPLAIN的使用分析

不同的sql語句寫法,往往會帶來很大的效能差異,我們怎麼才能知道執行sql查詢開銷呢?mysql為我們提供了explain關鍵詞,在你的select語句前加上explain關鍵詞,mysql將解釋它是如何處理的select查詢,提供有關表如何聯接和聯接的次序,所掃瞄的記錄數等相關資訊,你可以憑藉這些...