EXPLAIN是查看MySQL優化器如何決定執行查詢的主要方法,這個功能具有局限性,以為它並總是會說出真相,但是卻可以獲得最好信息.
學會解釋EXPLAIN,你就會了解MySQL優化器是如何工作,你才能去優化MySQL.
只需要在SELECT前面加上EXPLAIN即可.
在語句結尾(;之前)加上\G能夠更清晰的查看.
需要說的是EXPLAIN只對SELECT查詢作解釋,INSERT,UPDATE,DELETE不會哦.
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.
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
當FROM子句中有子查詢或UNION時,table列是<derivedN>,其中N是id列對應的值
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`)
Using index,MySQL將使用覆蓋索引,以避免訪問表(就是僅僅使用了索引中信息而沒有讀取表中)
Using where,意味著MySQL服務器將在存儲引擎檢索行後在進行過濾(將會通過WHERE條件來篩選存儲引擎返回的記錄)
Using temporary,意味著MySQL在對查詢結果排序時會用到一個臨時表.
Using filesort,意味著MySQL會對結果使用一個外部索引排序,而不是按索引次序從表裡讀出來.
Rangechecked for each record(indexmap:N),意味著沒有好用的索引,新的索引將在聯接的每一行上重新估算,N代表possible_keys列中索引的位圖,並且是冗余的.