生活随笔
收集整理的這篇文章主要介紹了
mysql-explain
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、總體看一下explain各字段
二、id
select查詢的序列號,包含一組數字,表示查詢中執行select子句或操作表的順序三種情況:
id相同,執行順序由上至下id不同,如果是子查詢,id的序號會遞增,id值越大優先級越高,越先被執行id相同或者不同的情況都同時存在
關注點:id號每個號碼,表示一趟獨立的查詢。一個sql 的查詢趟數越少越好。
二、 select_type
有哪些
查詢的類型,主要是用于區別:普通查詢、聯合查詢、子查詢等的復雜查詢
SIMPLE:簡單的 select 查詢,查詢中不包含子查詢或者UNIONPRIMARY:查詢中若包含任何復雜的子部分,最外層查詢則被標記為PrimaryDERIVED:在FROM列表中包含的子查詢被標記為DERIVED(衍生)MySQL會遞歸執行這些子查詢, 把結果放在臨時表里。SUBQUERY:在SELECT或WHERE列表中包含了子查詢DEPENDENT SUBQUERY:在SELECT或WHERE列表中包含了子查詢,子查詢基于外層UNCACHEABLE SUBQUREY:一般在查詢系統變量時就是這種類型,因為系統變量都會變的,是不可能直接從緩存中拿的UNION:若第二個SELECT出現在UNION之后,則被標記為UNION;若UNION包含在FROM子句的子查詢中,外層SELECT將被標記為:DERIVEDUNION RESULT:從UNION表獲取結果的SELECT
三、table:
顯示這一行的數據是關于哪張表的
四、partitions:
代表分區表中的命中情況,非分區表,該項為null
五、type:
type顯示的是訪問類型,是較為重要的一個指標,結果值從最好到最壞依次是:
system
> const > eq_ref
> ref
> fulltext
> ref_or_null
> index_merge
> unique_subquery
> index_subquery
> range
> index
> ALL
一般來說,得保證查詢至少達到range級別,最好能達到ref。
system:表只有一行記錄(等于系統表),這是const類型的特列,平時不會出現,這個也可以忽略不計const:表示通過索引一次就找到了,const用于比較primary key或者unique索引。因為只匹配一行數據,所以很快如將主鍵置于where列表中,MySQL就能將該查詢轉換為一個常量eq_ref:唯一性索引掃描,對于每個索引鍵,表中只有一條記錄與之匹配。常見于主鍵或唯一索引掃描ref:非唯一性索引掃描,返回匹配某個單獨值的所有行.
本質上也是一種索引訪問,它返回所有匹配某個單獨值的行,然而,它可能會找到多個符合條件的行,所以他應該屬于查找和掃描的混合體range:只檢索給定范圍的行,使用一個索引來選擇行。key 列顯示使用了哪個索引,一般就是在你的where語句中出現了between、<、>、in等的查詢,這種范圍掃描索引掃描比全表掃描要好,因為它只需要開始于索引的某一點,而結束語另一點,不用掃描全部索引。index:出現index是sql使用了索引但是沒用通過索引進行過濾,一般是使用了覆蓋索引或者是利用索引進行了排序分組all:Full Table Scan,將遍歷全表以找到匹配的行index_merge:在查詢過程中需要多個索引組合使用,通常出現在有 or 的關鍵字的sql中ref_or_null:對于某個字段既需要關聯條件,也需要null值得情況下。查詢優化器會選擇用ref_or_null連接查詢。index_subquery:利用索引來關聯子查詢,不再全表掃描。unique_subquery :該聯接類型類似于index_subquery。 子查詢中的唯一索引備注:一般來說,得保證查詢至少達到range級別,最好能達到ref。
六、possible_keys:
顯示可能應用在這張表中的索引,一個或多個。查詢涉及到的字段上若存在索引,則該索引將被列出,但不一定被查詢實際使用
七、key:
1.實際使用的索引。如果為NULL,則沒有使用索引
2.查詢中若使用了覆蓋索引,則該索引和查詢的select字段重疊
八、key_len:
1.表示索引中使用的字節數,可通過該列計算查詢中使用的索引的長度。
2.key_len字段能夠幫你檢查是否充分的利用上了索引
九、ref:
顯示索引的哪一列被使用了,如果可能的話,是一個常數。哪些列或常量被用于查找索引列上的值
十、rows:
rows列顯示MySQL認為它執行查詢時必須檢查的行數。
十一、filtered:
這個字段表示存儲引擎返回的數據在server層過濾后,剩下多少滿足查詢的記錄數量的比例,注意是百分比,不是具體記錄數
十二、Extra:
Using filesort(速度慢):說明mysql會對數據使用一個外部的索引排序,而不是按照表內的索引順序進行讀取。MySQL中無法利用索引完成的排序操作稱為“文件排序”Using temporary (速度慢):使了用臨時表保存中間結果,MySQL在對查詢結果排序時使用臨時表。常見于排序 order by 和分組查詢 group by。USING index: 表示相應的select操作中使用了覆蓋索引(Covering Index),避免訪問了表的數據行,效率不錯!
如果同時出現using where,表明索引被用來執行索引鍵值的查找;
如果沒有同時出現using where,表明索引只是用來讀取數據而非利用索引執行查找?;蛘?:利用索引進行了排序或分組。Using where:表明使用了where過濾(效率比較好)using join buffer(速度慢):使用了連接緩存impossible where (sql寫錯,如 i>2 and i<1): where子句的值總是false,不能用來獲取任何元組select tables optimized away(用上了優化器,少見): 在沒有GROUPBY子句的情況下,基于索引優化MIN/MAX操作,或者對于MyISAM存儲引擎優化COUNT(*)操作,不必等到執行階段再進行計算,查詢執行計劃生成的階段即完成優化。
總結
以上是生活随笔為你收集整理的mysql-explain的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。