explain簡介
explain專門用來做sql語句的調優的,在select語句前面加乙個explain可以把select的執行過程都列出來,包括哪些用了索引,哪些沒用索引,哪些查詢是全表查詢,哪些是索引查詢等 . 使用效果如下圖 :
概要描述
列名說明
id執行編號,標識select所屬的行。如果在語句中沒子查詢或關聯查詢,只有唯一的select,每行都將顯示1。否則,內層的select語句一般會順序編號,對應於其在原始語句中的位置
select_type
顯示本行是簡單或複雜select。如果查詢有任何複雜的子查詢,則最外層標記為primary(derived、union、union result)
table
訪問引用哪個表(引用某個查詢,如「emp」)
partitions
匹配的分割槽資訊(對於非分割槽表值為null)
type
資料訪問/讀取操作型別(all、index、range、ref、eq_ref、const/system、null)
possible_keys
揭示哪一些索引可能有利於高效的查詢
key顯示mysql決定採用哪個索引來優化查詢
key_len
顯示mysql在索引裡使用的位元組數
ref顯示了之前的表在key列記錄的索引中查詢值所用的列或常量
rows
為了找到所需的行而需要讀取的行數,估算值,不精確。通過把所有rows列值相乘,可粗略估算整個查詢會檢查的行數
filtered
按照條件表上資料被過濾的元組個數的百分比,rows×filtered/100可以求出過濾後的元組數即實際的元組數。
extra
額外資訊,如using index、filesort等
explain各欄位詳解
(1)
******
(簡單select,不使用union或子查詢等)(2
)primary
(子查詢中最外層查詢,查詢中若包含任何複雜的子部分,最外層的select被標記為primary)(
3)union
(union中的第二個或後面的select語句)(4
) dependent union
(union中的第二個或後面的select語句,取決於外面的查詢)(5
)union result(
union的結果,union語句中第二個select開始後面所有select)(
6) subquery(子查詢中的第乙個select,結果不依賴於外部查詢)(7
) dependent subquery(子查詢中的第乙個select,依賴於外部查詢)(8
) derived(派生表的select
,from子句的子查詢)(9
) uncacheable subquery(乙個子查詢的結果不能被快取,必須重新評估外鏈結的第一行)
型別
說明all
最壞的情況, 全表掃瞄, mysql將遍歷全表以找到匹配的行
index
full index scan,index與all區別為index型別只遍歷索引樹
range
範圍掃瞄,乙個有限制的索引掃瞄。key 列顯示使用了哪個索引。當使用=、 <>、>、>=、、between 或者 in 操作符,用常量比較關鍵字列時,可以使用 range
ref表示上述表的連線匹配條件,即哪些列或常量被用於查詢索引列上的值
eq_ref
類似ref,區別就在使用的索引是唯一索引,對於每個索引鍵值,表中只有一條記錄匹配,簡單來說,就是多表連線中使用primary key或者 unique key作為關聯條件
const、system
當mysql對查詢某部分進行優化,並轉換為乙個常量時,使用這些型別訪問。如將主鍵置於where列表中,mysql就能將該查詢轉換為乙個常量,system是const型別的特例,當查詢的表只有一行的情況下,使用system
null
mysql在優化過程中分解語句,執行時甚至不用訪問表或索引,例如從乙個索引列裡選取最小值可以通過單獨索引查詢完成。
結果從最好到最壞 依次是 :
null > system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > all
一般來說,我們需要保證查詢至少達到range級別,最好達到ref即可
extera
含義using filesort
當query中包含 order by 操作,而且無法利用索引完成的排序操作稱為「檔案排序」
using tempory
用臨時表儲存中間結果,常用於group by 和 order by操作中,一般看到它說明查詢需要優化了,就算避免不了臨時表的使用也要盡量避免硬碟臨時表的使用。
using index
表示相應的select操作使用了覆蓋索引,避免訪問表的資料行,效率不錯。
not exists
mysql優化了left join,一旦它找到了匹配left join標準的行, 就不再搜尋了。
using index condition
這是mysql 5.6出來的新特性,叫做「索引條件推送」。簡單說一點就是mysql原來在索引上是不能執行如like這樣的操作的,但是現在可以了,這樣減少了不必要的io操作,但是只能用在二級索引上。
using where
不用讀取表中所有資訊,僅通過索引就可以獲取所需資料,這發生在對錶的全部的請求列都是同乙個索引的部分的時候,表示mysql伺服器將在儲存引擎檢索行後再進行過濾
using join buffer
使用了連線快取:block nested loop,連線演算法是塊巢狀迴圈連線;batched key access,連線演算法是批量索引連線
impossible where
where子句的值總是false,不能用來獲取任何元組
select tables optimized away
在沒有group by子句的情況下,基於索引優化min/max操作,或者對於myisam儲存引擎優化count(*)操作,不必等到執行階段再進行計算,查詢執行計畫生成的階段即完成優化。
distinct
優化distinct操作,在找到第一匹配的元組後即停止找同樣值的動作
mysql 優化之索引篇(一)
一 索引的優點 a.索引可以加快查詢速度 b.索引是最有效的查詢優化條件 c.使用索引可以不用全表掃瞄 二 索引的缺點 a.降低了寫入的速度 insert update 寫入時不僅要求寫入到資料行,還要更新全部索引 索引的建立原則 a.盡量為用來搜尋 分類或分組的資料列編制索引,不要為輸出顯示的列編...
MySQL優化 之 索引
四種索引 主鍵索引,唯一索引,普通索引,全文索引 對查詢語句會提高效率 對增刪改語句會降低效率,因為還要對索引進行增刪改!建立索引會佔磁碟空間 對頻繁查詢的字段應建立索引,對頻繁更新的字段不適合建立索引 1 新增 1.1 主鍵索引新增 1.當一張表,把某個列設為主鍵的時候,則該列就是主鍵索引 cre...
Mysql優化之索引
索引其實就是乙個檔案,它與mysql資料檔案不一樣的地方是 它是順序的儲存資料,檔案小且儲存的位置也不一樣 索引能加快檢索,但系統每一次維護資料 寫入 更新 的同時也需要維護索引,帶來額外的開銷。索引按照底層實現方式分為 b樹索引 r樹索引 雜湊索引等 索引按照具體表現分為 主鍵索引 primary...