mysql執行計畫各自欄位的意義:
(一)各個欄位的含義
(1)id
id 列中的資料為一組數字,表示執行select語句順序
id值相同時,執行順序由上至下
id值越大優先順序越高,越先被執行
(2)select_type
查詢的型別,主要是用於區分普通查詢、聯合查詢、子查詢等複雜的查詢。
******:簡單的select查詢,查詢中不包含子查詢或者union
primary:查詢中包含任何複雜的子部分,最外層查詢則被標記為 primary
subquery:在select 或 where列表中包含了子查詢
derived:在from列表中包含的子查詢被標記為derived(衍生),mysql會遞迴執行這些子查詢,把結果放在臨時表裡
union:若第二個select出現在union之後,則被標記為union;若union包含在from子句的子查詢中,外層select將被標記為derived。mysql中的union操作符用於連線兩個以上的select語句的結果組合到乙個結果集中。
union result:從union表獲取結果的select
dependent subquery: 依賴外部結果的子查詢
dependent union: 當union作為子查詢時,第二或是第二個後的查詢的 select_type值
(3)table
輸出資料行所在的表的名稱
**< unionm,n>**由id為m,n查詢union產生的結果集
< derivedn>/< subqueryn>由id為n的查詢產生的結果
(4)partitions
對於分割槽表,顯示查詢的分割槽id
對於非分割槽表,顯示的為 null
(5)type
訪問型別,sql查詢優化中乙個很重要的指標,結果值從好到壞依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > all
system: 這是const聯接型別的乙個特例,當查詢的表只有一行時使用
const:表示通過索引一次就找到了,const用於比較primary key 或者 unique索引。因為只需匹配一行資料,所有很快。如果將主鍵置於where列表中,mysql就能將該查詢轉換為乙個const
eq_ref:唯一性索引掃瞄,對於每個索引鍵,表中只有一條記錄與之匹配。常見於主鍵 或 唯一索引掃瞄。
ref:非唯一性索引掃瞄,返回匹配某個單獨值的所有行。本質是也是一種索引訪問,它返回所有匹配某個單獨值的行,然而他可能會找到多個符合條件的行,所以它應該屬於查詢和掃瞄的混合體
ref_or_null類似於 ref型別的查詢,但是附加了對 null 值列的查詢
range:只檢索給定範圍的行,使用乙個索引來選擇行。key列顯示使用了那個索引。一般就是在where語句**現了between、<、>、in等的查詢。這種索引列上的範圍掃瞄比全索引掃瞄要好。只需要開始於某個點,結束於另乙個點,不用掃瞄全部索引
index:full index scan,index與all區別為index型別只遍歷索引樹。這通常為all塊,應為索引檔案通常比資料檔案小。(index與all雖然都是讀全表,但index是從索引中讀取,而all是從硬碟讀取)
all:full table scan,遍歷全表以找到匹配的行
(6)possible_keys
指出mysql能使用哪些索引來優化查詢
查詢列所涉及的列上的索引都會被列出來,但不一定會被使用
(7)key
實際使用的索引,如果為null,則沒有使用索引。
查詢中如果使用了覆蓋索引,則該索引僅出現在key列表中。
(8)key_len
表示索引欄位的最大的可能長度
key_len的長度由欄位定義計算而來,並非資料的實際長度
ref表示那些列或常量被用於查詢索引列上的值。
(9)rows
表示msql通過索引的統計資訊,估算的所需讀取的行數
rows值的大小時個統計抽樣的結果,並不十分的準確。
(10)filtered
表示返回的結果的行數佔需要讀取行數的百分比
filtered列的值越大越好
filtered列的值依賴的說統計資訊
extra
distinct優化distinct操作,在找到第一匹配的元祖後即停止找同樣的動作
not exists使用 not exists 來優化查詢
using filesort使用額外操作進行排序,通常會出現在order by 或 group by 查詢
using index使用了覆蓋索引進行查詢
using temporary mysql需要使用臨時表來處理查詢,常見於排序,子查詢,和分組查詢
using where需要在mysql伺服器層使用 where條件來過濾資料
slect tables /optimized away直接通過索引來獲得資料,不用訪問表
mysql執行計畫字段解析 MySQL執行計畫解析
前言 在實際資料庫專案開發中,由於我們不知道實際查詢時資料庫裡發生了什麼,也不知道資料庫是如何掃瞄表 如何使用索引的,因此,我們能感知到的就只有sql語句的執行時間。尤其在資料規模比較大的場景下,如何寫查詢 優化查詢 如何使用索引就顯得很重要了。那麼,問題來了,在查詢前有沒有可能估計下查詢要掃瞄多少...
MYSQL執行計畫字段詳解
mysql檢視執行計畫 explain sql 輸出執行計畫。explain extended sql 會在 explain 的基礎上額外提供一些查詢優化的資訊。緊隨其後通過 show warnings 命令可以 得到優化後的查詢語句,從而看出優化器優化了什麼。額外還有 filtered 列,是乙個...
mysql執行計畫 MySQL 執行計畫
1.執行計畫的定義 什麼是執行計畫 查詢計畫 呢?執行計畫就是一系列的操作步驟。sql是宣告性語言,它只告訴資料庫要查詢什麼,但並不告訴資料庫如何去查。資料庫所要做的就是基於演算法和統計資訊計算出一條最佳的訪問路徑。這個工作是由優化器來完成的。優化器會比較不同的執行計畫,然後選擇其中最優的一套。2....