MySQL中EXPLAIN的解釋

來源:互聯網
上載者:User

標籤:

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列中索引的位元影像,並且是冗餘的.

 

MySQL中EXPLAIN的解釋

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.