MySQL中EXPLAIN的解釋
EXPLAIN是查看MySQL優化器如何決定執行查詢的主要方法,這個功能具有局限性,以為它並總是會說出真相,但是卻可以獲得最好信息.
學會解釋EXPLAIN,你就會了解MySQL優化器是如何工作,你才能去優化MySQL.
如何調用?
只需要在SELECT前面加上EXPLAIN即可.
在語句結尾(;之前)加上\G能夠更清晰的查看.
需要說的是EXPLAIN只對SELECT查詢作解釋,INSERT,UPDATE,DELETE不會哦.
EXPLAIN中的列
id列一個標識SELECT所屬行編號,如果在語句中沒有子查詢或聯合,說明只有一個SELECT,於是這個列顯示為1,否則內層的SELECT會順序編號.
MySQL將SELECT查詢分為簡單和復雜類型,復雜類型可分為:簡單子查詢,所謂的派生表(在FROM子句中的子查詢),UNION查詢.
簡單子查詢:EXPLAIN SELECT (SELECT `uid` FROM `tips` limit 1) FROM `test_key` WHERE 1
所謂的派生表(在FROM子句中的子查詢)EXPLAIN SELECT uid FROM (SELECT uid FROM user) as der.
select_type列:顯示了對應還是簡單還是復雜SELECT(如果是後者,則將會是三種復雜類型中的一種).
SIMPLE意味著查詢中不包含子查詢和UNION.如果查詢中包含子查詢或UNION,那麼最外層的SELECT被標記為PRIMARY(也就是id列為1的)
其他標記:
SUBQUERY,包含在SELECT列表中的子查詢(不在FROM子句中)被標記為此;
DERIVED,在FROM子句中的子查詢被標記為此;
UNION,在UNION中的第二個和隨後的SELECT被標記為此;如EXPLAIN SELECT 1 UNION ALL SELECT 1
UNION RESULT,用來從UNION的臨時表檢索結果的SELECT標記為UNION RESULT,如EXPLAIN SELECT 1 UNION ALL SELECT 1
table列:顯示對應行正在訪問哪個表
當FROM子句中有子查詢或UNION時,table列是<derivedN>,其中N是id列對應的值
type列:就是MySQL決定如何查找表中行(一下從最差到最優排列)
ALL,全表掃描
index,跟全表掃描一樣,知識MySQL在掃描表時按索引次序進行而不是行range,范圍掃描,一個有限制的索引掃描,它開始於索引裡的某一點,返回匹配這個值域的行(顯而易見的范圍掃描.即帶有BETWEEN或在WHERE子句中帶有>的查詢,當MySQL使用索引去查找一系列值的時候,如IN()和OR列表,也為顯示的范圍掃描)
ref,一種索引訪問也叫索引查找,他返回所有匹配某單個值的行,它可能會找到多個符合條件行(EXPLAIN SELECT tipname FROM `tips` WHERE uid=10984)
eq_ref,一種索引查找,他最多只返回一條符合條件的行.這種會在使用主鍵或者唯一性索引時看到.(EXPLAIN SELECT * FROM `tips` WHERE uid=12)
const和system,當MySQL能對查詢的某部分進行優化並將其轉換成一個常量時(EXPLAIN SELECT * FROM `tips` WHERE id=5)
NULL,這種訪問方式意味著MySQL能在優化階段分解查詢語句,在執行階段用不著在訪問表或者索引(EXPLAIN SELECT max(id),min(id)FROM `tips`)
possible_keys列:這一列顯示了查詢可以使用哪些索引,是基於查詢訪問的列和使用的比較操作符來判斷的.
key列:這一列顯示了MySQL決定采用哪個索引來優化對該表的訪問
key_len列:顯示MySQL在索引裡使用的字節數.舉個例子就是在查詢中使用到了主鍵,而主鍵的數據類型為INT,則為4,SMALLINT則為2
ref列:顯示了之前的表在key列記錄的索引中查詢值所用到的列或常量.
row列:顯示的是MySQL為了找到所需的值而要讀取的行數.
Extra列:在此顯示的是在其他列不適合顯示的額外信息
Using index,MySQL將使用覆蓋索引,以避免訪問表(就是僅僅使用了索引中信息而沒有讀取表中)
Using where,意味著MySQL服務器將在存儲引擎檢索行後在進行過濾(將會通過WHERE條件來篩選存儲引擎返回的記錄)
Using temporary,意味著MySQL在對查詢結果排序時會用到一個臨時表.
Using filesort,意味著MySQL會對結果使用一個外部索引排序,而不是按索引次序從表裡讀出來.
Rangechecked for each record(indexmap:N),意味著沒有好用的索引,新的索引將在聯接的每一行上重新估算,N代表possible_keys列中索引的位圖,並且是冗余的。