時間:2020-08-09來源:www.farandoo.com作者:電腦系統城
使用EXPLAIN
很簡單,只需要在執行的SQL前面加上EXPLAIN
即可
explain select s.sid sid, s.name studentName, s.age age, c.name className from student_class sc, student s, class c;
執行結果如下:
EXPLAIN
命令中經常使用到的列有id、
id是一個編號,標識SELECT
所屬的行。如果在語句當中沒有子查詢或聯合查詢,那么之后有唯一的SELECT,于是每一行在這個列中都顯示1。否則,內層的SELECT語句一般會順序編號,對應于其在語句中的位置。
SELECT列中子查詢
FROM子句中的子查詢
UNION查詢
注意UNION
結果總是放在一個匿名臨時表中,之后MySQL將結果讀取到臨時表外。臨時表不在原SQL中出現,因此它的id
列是NULL
select_type
列顯示了對應行是簡單還是復雜SELECT
,具體如下:
select_type | 描述 |
---|---|
SIMPLE |
簡單查詢,不包含任何復雜的子查詢(FROM 子句中的子查詢除外) |
PRIMARY |
復雜查詢 |
SUBQUERY |
復雜查詢,包含在SELECT 列表中的SELECT 標記為SUBQUERY |
DERIVED |
復雜查詢,包含在FROM 子句中的查詢 |
UNION |
復雜查詢,在UNION 查詢中的第二個和隨后的SELECT 被標記為UNION |
UNION RESULT |
復雜查詢,用來從UNION 的匿名臨時表檢索結果的SELECT 被標記為UNION RESULT |
table
列顯示了對應行在訪問哪個表。在通常情況下,它相當明了:它就是那個表,或是該表的別名。當FROM
子句中有子查詢或有UNION
時,table列會變得復雜得多。
FROM
子句中有子查詢時,table
列是<derivedN>,其中N是子查詢的id
UNION
時,UNION RESULT
的table
列中包含一個參與UNION
的id
列表,如<union1,2>type
表示的是訪問類型,也就是說MySQL決定如何查找表中的行。下面列表中依次從最差到最優:
type | 描述 |
---|---|
ALL |
全表掃描,從頭到尾掃描整個表,效率最差 |
index |
和全表掃描一樣,只是MySQL掃描表時按索引次序進行而不是行,主要優點時避免了排序 |
range |
范圍掃描就是一個有限制的索引掃描,它開始于索引里的某一點,返回匹配這個值域的行。BETWEEN ,IN 和OR 都屬于這類 |
ref |
這是一種索引訪問(索引查找),它返回所有匹配某個單個值的行。當使用非唯一性索引或者唯一性索引的非唯一性前綴時才會發生 |
eq_ref |
使用這種索引查找,MySQL知道最多只返回一條符合條件的記錄。在使用主鍵或者唯一性索引查找時發生 |
const、system |
當MySQL能對查詢的某部分進行優化并將其轉換成一個常量時,它就會使用這種類型。如果通過將某一行的主鍵放入WHERE子句里的方式來選取次行的主鍵,MySQL就能幫這個查詢轉換為一個常量 |
NULL |
意味著MySQL能在優化階段分解查詢語句,在執行階段甚至用不著再訪問表或索引。如從一個索引列里面選取最小值可以通過單獨查找索引來完成,不需要在執行時訪問表 |
possible_keys
表示查詢可能使用哪些索引,這是基于查詢訪問的列和使用的比較操作符來判斷的
key
顯示了MySQL決定采用哪個索引來優化對表的訪問。如果該索引沒有出現在possible_keys
列中,那么MySQL可能選擇了一個覆蓋索引,哪怕沒有WHERE
子句
key_len
顯示了MySQL在索引字段中可能的最大長度。當索引字段是多個時,長度為多個字段長度的和,每個字段的長度是根據定義的表結構中的長度來計算的
ref
顯示了之前的表在key列記錄的索引中查找值所用的列或常量。
rows
表示估計為了找到所需的行而要讀取的行數。這個值越小越好
filtered
顯示的是針對表里符合某個條件的記錄數的百分比所做的一個悲觀估算。如果你把rows
列和這個百分比相乘,就能看到MySQL估算它將和查詢計劃里面一個表關聯的行數。
Extra
包含的是不適合在其他列顯示的額外信息。具體如下:
Extra | 描述 |
---|---|
Using index |
意味著MySQL使用覆蓋索引,避免訪問表 |
Using where |
意味著MySQL服務器將在存儲引擎檢索行后再進行過濾,并不是所有的WHERE 條件查詢都有 |
Using temporary |
意味著MySQL在對查詢結果排序時使用一個臨時表 |
Using filesort |
意味著MySQL會對結果使用一個外部索引排序,而不是按索引次序從表里讀取行 |
Range checked for each record (index map: N) |
這個值意味著沒有好用的索引,新的索引將在聯接的每一行上重新估算。工作中暫時沒有遇到 |
以上內容如有描述錯誤的地方希望大家可以幫忙指出,一起交流學習!
2022-03-09
MySQL存儲過程圖文實例講解教程2022-03-01
千萬級用戶系統SQL調優實戰分享2022-03-01
mysql遠程跨庫聯合查詢的示例為什么要主從同步? 主從同步的原理 MYSQL數據庫進行主從同步 創建兩個MYSQL數據庫 初始化,安裝主機數據庫 配置從機 測試主從同步 ...
2022-03-01
這篇文章主要介紹了銀河麒麟V10安裝MySQL8028的圖文教程,并詳細介紹了遠程訪問的實現方法,本文通過圖文命令給大家介紹的非常詳細...
2022-02-28