1. 程式人生 > >7.使用EXPLAIN 來分析SQL和表結構_2

7.使用EXPLAIN 來分析SQL和表結構_2

數據行 影響 位置 一行 nbsp temp 使用 null 字段

possible_keys ------ 顯示可能應用在這張表的索引,一個或多個

          查詢涉及到的字段上若存在索引,則該索引將被列出,但不一定被實際查詢使用

key ------ 實際使用的索引。如果為NULL,則沒有使用索引

     查詢中若使用了 覆蓋索引,則該索引和查詢的select字段重疊

     select 字段可以是索引的一部分,即索引中的字段可以將要查詢的字段覆蓋(是select後面的字段,不是where後面的字段)

key_len ------ 表示索引中使用的字節數,可通過該列計算查詢中使用的索引的長度,在不損失精度的情況下,長度越短遇到越好

       key_len 顯示的值為索引字段的最大可能長度,並非實際使用長度,

       即key_len是根據定義計算而得,不是通過表內檢索出的

rows ------ 根據表統計信息及索引選用情況,大致估算出找到所需的記錄需要讀取的行數

Extra ------ 包含不適合在其他列中顯示但十分重要的額外信息

  1.Using filesort 說明mysql會對數據使用一個外部的索引序列,而不是按照表內的索引順序進行讀取

  MySQL無法利用索引完成的排序操作稱為 ‘文件排序’,(需要避免)

  2.Using temporary 使用臨時表保存中間結果,MySQL在對查詢結果排序時使用臨時表。常見於排序order by和分組查詢group by

    一般使用排序order by和 分組查詢 group by 這種需要使用到索引排序的功能的時候,

    要按照創建索引時的個數和順序來,否則很容易產生文件內排序 和 臨時表 ,影響性能

    為什麽要按照這個索引的個數和順序來:一個索引,創建一棵樹,如果是聯合索引,第二列會放在第一列後面

    第二列也做了排序,首先根據第一列排序的結果,在第一列一樣的情況下,第二列再排序

    如:A = 22 AND B = 33

    你假設一下 C = A*1000 + B,然後根據C做BTREE,以A先放,A相同的情況下按B的順序放

    存的時候 A 先 存,確定了A的位置之後,再存B;;查的時候,也要先有A,有了A的準確位置,才能拿到B

  

  Using index ------ 表示相應的select 操作中使用了覆蓋索引(Covering Index),避免訪問了表的數據行,效率不錯

           如果同時出現using where ,表明索引被用來執行索引鍵值的查找

           如果沒有同時出現 using where,表明索引用來讀取數據而非執行查找動作

  Using where ------ 表明使用了 where 過濾

  Using join buffer ------ 使用了連接緩存

  impossible where ------ where 子句的值總是 false,不能用來獲取任何元祖

  select tables optimized away ------

  distinct ------ 優化 distinct 操作,在找到第一行匹配的元組後即停止找同樣值的動作

    

7.使用EXPLAIN 來分析SQL和表結構_2