7.使用EXPLAIN 來分析SQL和表結構_2
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