使用方法,在select語句前加上explain就可以了:
explain select surname,first_name form a,b where a.id=b.id
explain列的解釋:
table:顯示這一行的資料是關於哪張表的。
type:這是重要的列,顯示連線使用了何種型別。從最好到最差的連線型別為const、eq_reg、ref、range、index和all。
key: 實際使用的索引。如果為null,則沒有使用索引。很少的情況下,mysql會選擇優化不足的索引。這種情況下,可以在select語句中使用use index(indexname)來強制使用乙個索引或者用ignore index(indexname)來強制mysql忽略索引。
key_len:使用的索引的長度。在不損失精確性的情況下,長度越短越好。
ref:顯示索引的哪一列被使用了,如果可能的話,是乙個常數。
rows:mysql認為必須檢查的用來返回請求資料的行數。
extra:關於mysql如何解析查詢的額外資訊。
extra列返回的描述的意義:
distinct: 一旦mysql找到了與行相聯合匹配的行,就不再搜尋了。not exists: mysql優化了left join,一旦它找到了匹配left join標準的行,就不再搜尋了。
range checked
foreach record(index map:#): 沒有找到理想的索引,因此對於從前面表中來的每乙個行組合,mysql檢查使用哪個索引,並用它來從表中返回行。這是使用索引的最慢的連線之一。
using filesort: 看到這個的時候,查詢就需要優化了。mysql需要進行額外的步驟來發現如何對返回的行排序。它根據連線型別以及儲存排序鍵值和匹配條件的全部行的行指標來排序全部行。
using index: 列資料是從僅僅使用了索引中的資訊而沒有讀取實際的行動的表返回的,這發生在對錶的全部的請求列都是同乙個索引的部分的時候。
using temporary: 看到這個的時候,查詢需要優化了。這裡,mysql需要建立乙個臨時表來儲存結果,這通常發生在對不同的列集進行order by上,而不是group by上。
where used: 使用了where從句來限制哪些行將與下一張表匹配或者是返回給使用者。如果不想返回表中的全部行,並且連線型別all或index,這就會發生,或者是查詢有問題不同連線型別的解釋(按照效率高低的順序排序)。
system: 表只有一行:system表。這是const連線型別的特殊情況。
const: 表中的乙個記錄的最大值能夠匹配這個查詢(索引可以是主鍵或惟一索引)。因為只有一行,這個值實際就是常數,因為mysql先讀這個值然後把它當做常數來對待。
eq_ref: 在連線中,mysql在查詢時,從前面的表中,對每乙個記錄的聯合都從表中讀取乙個記錄,它在查詢使用了索引為主鍵或惟一鍵的全部時使用。
ref: 這個連線型別只有在查詢使用了不是惟一或主鍵的鍵或者是這些型別的部分(比如,利用最左邊字首)時發生。對於之前的表的每乙個行聯合,全部記錄都將從表中讀出。這個型別嚴重依賴於根據索引匹配的記錄多少—越少越好。
range: 這個連線型別使用索引返回乙個範圍中的行,比如使用》或《查詢東西時發生的情況。
index: 這個連線型別對前面的表中的每乙個記錄聯合進行完全掃瞄(比all更好,因為索引一般小於表資料)。
all: 這個連線型別對於前面的每乙個記錄聯合進行完全掃瞄,這一般比較糟糕,應該盡量避免。
mysql索引建立 刪除 檢視 檢測
小編今天稍微學習了下mysql 索引的相關知識 1 建立索引 altert table 表名 add unique 列 建立唯一索引 altert table 表名 add index 索引名 列 建立普通索引 altert table 表名 add primary key 列 建立主鍵索引 alt...
mysql怎樣建立索引 mysql如何建立索引?
mysql建立索引的方法 1 使用create table語句配合index或unique關鍵字在建立表的時候直接建立索引 2 使用alter table語句來直接建立索引 3 使用create index語句對錶增加普通索引或unique索引。mysql如何建立索引?1 alter table a...
如何正確的建立MySQL索引
1 較頻繁地作為查詢條件的字段 這個都知道。什麼是教頻繁呢?分析你執行的所有sql語句。最好將他們乙個個都列出來。然後分析,發現其中有些欄位在大部分的sql語句查詢時候都會用到,那麼就果斷為他建立索引。2 唯一性太差的字段不適合建立索引 什麼是唯一性太差的字段。如狀態字段 型別字段。那些只儲存固定幾...