explain會看到的資訊我經常看的的是id,type,rows這幾個1、id表示查詢中執行select子句或操作表的順序,id執行順序從大到小,即id越大越先被執行,如果id相同,則從上到下2、select_type表示查詢中每個select子句的型別(簡單 or 複雜)
(1)、******:查詢中不包含子查詢或者union
(2)、查詢中若包含任何複雜的子部分,最外層查詢則被標記為:primary
(3)、在select或where列表中包含了子查詢,該子查詢被標記為:subquery
(4)、在from列表中包含的子查詢被標記為:derived(衍生)
(5)、若第二個select出現在union之後,則被標記為union;若union包含在 from子句的子查詢中,外層select將被標記為:derived
(6)、從union表獲取結果的select被標記為:union result
阿里有一篇select_type的詳解文章3、type這是優化的乙個重要的參考引數或者指標,表示mysql在表中找到所需行的方式,又稱「訪問型別」
常見的型別有
網上有乙個比較全面的指標排序
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > all ,
一般來說,得保證查詢至少達到range級別,最好能達到ref,至少達到range。
(1)、all: 掃瞄全表,將進行全表掃瞄來查詢所需資料,效能最差
(2)、index: 掃瞄全部索引樹,與all區別為index型別只遍歷索引樹
(3)、range: 掃瞄部分索引,索引範圍掃瞄,對索引的掃瞄開始於某一點,返回匹配值域的行,常見於between、等的查詢
(4)、ref: 非唯一性索引掃瞄,返回匹配某個單獨值的所有行。常見於使用非唯一索引即唯一索引的非唯一字首進行的查詢
(5)、eq_ref:唯一性索引掃瞄,對於每個索引鍵,表中只有一條記錄與之匹配。常見於主鍵或唯一索引掃瞄
(6)、const, system: 當mysql對查詢某部分進行優化,並轉換為乙個常量時,使用這些型別訪問。如將主鍵置於where列表中,mysql就能將該查詢轉換為乙個常量。system是const型別的特例,當查詢的表只有一行的情況下, 使用system。
(7)、null: mysql在優化過程中分解語句,執行時甚至不用訪問表或索引。4、possible_keys指出mysql能使用哪個索引在該表中找到行。查詢涉及到的字段上若存在索引,則該索引將被列出,但不一定被查詢使用。如果是空的,沒有相關的索引。這時要提高效能,可通過檢驗where子句,看是否引用某些字段,或者檢查字段不是適合索引。
有一篇優化例項:5、key顯示mysql在查詢中實際使用的索引,若沒有使用索引,顯示為null
tips:查詢中若使用了覆蓋索引,則該索引僅出現在key列表中6、key_len顯示mysql決定使用的鍵長度。表示索引中使用的位元組數,可通過該列計算查詢中使用的索引的長度。如果鍵是null,長度就是null。文件提示特別注意這個值可以得出乙個多重主鍵裡mysql實際使用了哪一部分。
注:key_len顯示的值為索引欄位的最大可能長度,並非實際使用長度,即key_len是根據表定義計算而得,不是通過表內檢索出的。
key_len計算的一篇文章:7、ref:表示上述表的連線匹配條件,即哪些列或常量被用於查詢索引列上的值
對於每個來自於前面的表的行組合,所有有匹配索引值的行將從這張表中讀取。如果聯接只使用鍵的最左邊的字首,或如果鍵不是unique或primary key(換句話說,如果聯接不能基於關鍵字選擇單個行的話),則使用ref。如果使用的鍵僅僅匹配少量行,該聯接型別是不錯的。
ref可以用於使用=或<=>操作符的帶索引的列。8、rows:這個數表示mysql要遍歷多少資料才能找到,表示mysql根據表統計資訊及索引選用情況,估算的找到所需的記錄所需要讀取的行數,而不是查詢到結果的行數9、extra:包含不適合在其他列中顯示但十分重要的額外資訊。
only index,這意味著資訊只用索引樹中的資訊檢索出的,這比掃瞄整個表要快。
using where是使用上了where限制,表示mysql伺服器在儲存引擎受到記錄後進行「後過濾」(post-filter),如果查詢未能使用索引,using where的作用只是提醒我們mysql將用where子句來過濾結果集。
impossible where 表示用不著where,一般就是沒查出來啥。
using filesort(mysql中無法利用索引完成的排序操作稱為「檔案排序」)當我們試圖對乙個沒有索引的字段進行排序時,就是filesoft。它跟檔案沒有任何關係,實際上是內部的乙個快速排序。
using temporary(表示mysql需要使用臨時表來儲存結果集,常見於排序和分組查詢),使用filesort和temporary的話會很吃力,where和order by的索引經常無法兼顧,如果按照where來確定索引,那麼在order by時,就必然會引起using filesort,這就要看是先過濾再排序划算,還是先排序再過濾划算。
mysql執行計畫 MySQL 執行計畫
1.執行計畫的定義 什麼是執行計畫 查詢計畫 呢?執行計畫就是一系列的操作步驟。sql是宣告性語言,它只告訴資料庫要查詢什麼,但並不告訴資料庫如何去查。資料庫所要做的就是基於演算法和統計資訊計算出一條最佳的訪問路徑。這個工作是由優化器來完成的。優化器會比較不同的執行計畫,然後選擇其中最優的一套。2....
mysql 生成執行計畫 MySQL執行計畫
和很多其他關係型資料庫不通,mysql並不會在生成查詢位元組碼來執行查詢。mysql生成查詢的一棵指令樹,然後通過儲存引擎執行完成這棵指令樹並返回結果。最終的執行計畫包含了重構查詢的全部資訊。如果某個查詢執行explain extended 之後,在執行show warnings,就可以看到重構出的...
mysql 查詢執行計畫 MySql執行計畫的檢視
一。什麼是資料庫執行計畫 利用乙個sql語句,你可能要server取出所有news表中的資訊.當server收到的這條sql的時候,第一件事情並不是解析它.如果這條sql沒有語法錯誤,server才會繼續工作.server會決定最好的計算方式.server會選擇,是讀整個news表好呢,還是利用索引...