mysql explain 解釋

EXPLAIN列的解釋: sql

table:顯示這一行的數據是關於哪張表的 優化

type:這是重要的列,顯示鏈接使用了何種類型。從最好到最差的鏈接類型爲const、eq_reg、ref、range、indexhe和ALL 指針

possible_keys:顯示可能應用在這張表中的索引。若是爲空,沒有可能的索引。能夠爲相關的域從WHERE語句中選擇一個合適的語句 code

key: 實際使用的索引。若是爲NULL,則沒有使用索引。不多的狀況下,MYSQL會選擇優化不足的索引。這種狀況下,能夠在SELECT語句中使用USE INDEX(indexname)來強制使用一個索引或者用IGNORE INDEX(indexname)來強制MYSQL忽略索引 排序

key_len:使用的索引的長度。在不損失精確性的狀況下,長度越短越好 索引

ref:顯示索引的哪一列被使用了,若是可能的話,是一個常數 get

rows:MYSQL認爲必須檢查的用來返回請求數據的行數 it

Extra:關於MYSQL如何解析查詢的額外信息。將在表4.3中討論,但這裏能夠看到的壞的例子是Using temporary和Using filesort,意思MYSQL根本不能使用索引,結果是檢索會很慢 io

extra列返回的描述的意義 table

Distinct:一旦MYSQL找到了與行相聯合匹配的行,就再也不搜索了

Not exists: MYSQL優化了LEFT JOIN,一旦它找到了匹配LEFT JOIN標準的行,就再也不搜索了

Range checked for each Record(index map:#):沒有找到理想的索引,所以對於從前面表中來的每個行組合,MYSQL檢查使用哪一個索引,並用它來從表中返回行。這是使用索引的最慢的鏈接之一

Using filesort: 看到這個的時候,查詢就須要優化了。MYSQL須要進行額外的步驟來發現如何對返回的行排序。它根據鏈接類型以及存儲排序鍵值和匹配條件的所有行的行指針來排序所有行

Using index: 列數據是從僅僅使用了索引中的信息而沒有讀取實際的行動的表返回的,這發生在對錶的所有的請求列都是同一個索引的部分的時候

Using temporary 看到這個的時候,查詢須要優化了。這裏,MYSQL須要建立一個臨時表來存儲結果,這一般發生在對不一樣的列集進行ORDER BY上,而不是GROUP BY上

Where used 使用了WHERE從句來限制哪些行將與下一張表匹配或者是返回給用戶。若是不想返回表中的所有行,而且鏈接類型ALL或index,這就會發生,或者是查詢有問題不一樣鏈接類型的解釋(按照效率高低的順序排序)

system 表只有一行:system表。這是const鏈接類型的特殊狀況

const:表中的一個記錄的最大值可以匹配這個查詢(索引能夠是主鍵或唯一索引)。由於只有一行,這個值實際就是常數,由於MYSQL先讀這個值而後把它當作常數來對待

eq_ref:在鏈接中,MYSQL在查詢時,從前面的表中,對每個記錄的聯合都從表中讀取一個記錄,它在查詢使用了索引爲主鍵或唯一鍵的所有時使用

ref:這個鏈接類型只有在查詢使用了不是唯一或主鍵的鍵或者是這些類型的部分(好比,利用最左邊前綴)時發生。對於以前的表的每個行聯合,所有記錄都將從表中讀出。這個類型嚴重依賴於根據索引匹配的記錄多少—越少越好

range:這個鏈接類型使用索引返回一個範圍中的行,好比使用>或<查找東西時發生的狀況

index: 這個鏈接類型對前面的表中的每個記錄聯合進行徹底掃描(比ALL更好,由於索引通常小於表數據)

ALL:這個鏈接類型對於前面的每個記錄聯合進行徹底掃描,這通常比較糟糕,應該儘可能避免

示例

EXPLAIN select
        distinct nom.orgL1Name,
        nom.orgL2Name,
        nom.htFileId,
        us.id userId,
        ud.user_name userName,
        org.org_name orgName,
        nom.nomStatus,
        nom.id as nomId,
        us.login_name loginName,
        nom.psDate psDate,
        nom.submitDate submitDate,
        nom.q2FinalScore q2FinalScore,
        nom.q3FinalScore q3FinalScore,
        nom.q4FinalScore q4FinalScore 
    from
        org_user as us 
    inner join
        org_org_user as oou 
            on oou.user_id = us.id 
    inner join
        org_user_detail as ud 
            on us.id = ud.user_id 
    inner join
        org_role_user as oru 
            on us.id = oru.account_id 
    inner join
        org_role as role 
            on oru.role_id = role.id 
    inner join
        org_organization as org 
            on oou.org_id = org.id 
    LEFT JOIN
        (
            select
                * 
            from
                jx_nom jn force index(INDEX_YEAR) //強制子查詢使用索引
            where
                jn.year = '2015' 
        ) as nom 
            on us.id = nom.target_id  
    where
        oou.relation_status != 3 
        and oru.relation_status != 3 
        and us.user_status != 3 
        and nom.year = '2015' 
    order by
        userName limit 10


相關文章
相關標籤/搜索