7.2.1 explain 語法(得到select 的相關(guān)信息)
explain tbl_name
或者:
explain select select_options
explain 語句可以被當(dāng)作 describe 的同義詞來用,也可以用來獲取一個mysql要執(zhí)行的 select 語句的相關(guān)信息。
explain tbl_name 語法和 describe tbl_name 或 show columns from tbl_name 一樣。
當(dāng)在一個 select 語句前使用關(guān)鍵字 explain 時,mysql會解釋了即將如何運行該 select 語句,它顯示了表如何連接、連接的順序等信息。
本章節(jié)主要講述了第二種 explain 用法。
在 explain 的幫助下,您就知道什么時候該給表添加索引,以使用索引來查找記錄從而讓 select 運行更快。
如果由于不恰當(dāng)使用索引而引起一些問題的話,可以運行 analyze table 來更新該表的統(tǒng)計信息,例如鍵的基數(shù),它能幫您在優(yōu)化方面做出更好的選擇。詳情請看"14.5.2.1 analyze table syntax"。
您還可以查看優(yōu)化程序是否以最佳的順序來連接數(shù)據(jù)表。為了讓優(yōu)化程序按照 select 語句中的表名的順序做連接,可以在查詢的開始使用 select straight_join 而不只是 select。
explain 返回了一行記錄,它包括了 select 語句中用到的各個表的信息。這些表在結(jié)果中按照mysql即將執(zhí)行的查詢中讀取的順序列出來。mysql用一次掃描多次連接(single-sweep, multi-join) 的方法來解決連接。這意味著mysql從第一個表中讀取一條記錄,然后在第二個表中查找到對應(yīng)的記錄,然后在第三個表中查找,依次類推。當(dāng)所有的表都掃描完了,它輸出選擇的字段并且回溯所有的表,直到找不到為止,因為有的表中可能有多條匹配的記錄下一條記錄將從該表讀取,再從下一個表開始繼續(xù)處理。
在mysql version 4.1中,explain 輸出的結(jié)果格式改變了,使得它更適合例如 union 語句、子查詢以及派生表的結(jié)構(gòu)。更令人注意的是,它新增了2個字段: id 和 select_type。當(dāng)你使用早于mysql 4.1的版本就看不到這些字段了。
explain 結(jié)果的每行記錄顯示了每個表的相關(guān)信息,每行記錄都包含以下幾個字段:
id
本次 select 的標(biāo)識符。在查詢中每個 select 都有一個順序的數(shù)值。
select_type
select 的類型,可能會有以下幾種:
simple
簡單的 select (沒有使用 union 或子查詢)
primary
最外層的 select。
union
第二層,在select 之后使用了 union 。
dependent union
union 語句中的第二個 select,依賴于外部子查詢
subquery
子查詢中的第一個 select
dependent subquery
子查詢中的第一個 subquery 依賴于外部的子查詢
derived
派生表 select(from 子句中的子查詢)
table
記錄查詢引用的表。
type
表連接類型。以下列出了各種不同類型的表連接,依次是從最好的到最差的:
system
表只有一行記錄(等于系統(tǒng)表)。這是 const 表連接類型的一個特例。
const
表中最多只有一行匹配的記錄,它在查詢一開始的時候就會被讀取出來。由于只有一行記錄,在余下的優(yōu)化程序里該行記錄的字段值可以被當(dāng)作是一個恒定值。const 表查詢起來非常快,因為只要讀取一次!const 用于在和 primary key 或 unique 索引中有固定值比較的情形。下面的幾個查詢中,tbl_name 就是 const 表了:
select * from tbl_name where primary_key=1;
select * from tbl_name
where primary_key_part1=1 and primary_key_part2=2;
eq_ref
從該表中會有一行記錄被讀取出來以和從前一個表中讀取出來的記錄做聯(lián)合。與 const 類型不同的是,這是最好的連接類型。它用在索引所有部分都用于做連接并且這個索引是一個 primary key 或 unique 類型。eq_ref 可以用于在進(jìn)行"="做比較時檢索字段。比較的值可以是固定值或者是表達(dá)式,表達(dá)示中可以使用表里的字段,它們在讀表之前已經(jīng)準(zhǔn)備好了。以下的幾個例子中,mysql使用了 eq_ref 連接來處理 ref_table:
select * from ref_table,other_table
where ref_table.key_column=other_table.column;
select * from ref_table,other_table
where ref_table.key_column_part1=other_table.column
and ref_table.key_column_part2=1;
ref
該表中所有符合檢索值的記錄都會被取出來和從上一個表中取出來的記錄作聯(lián)合。ref 用于連接程序使用鍵的最左前綴或者是該鍵不是 primary key 或 unique 索引(換句話說,就是連接程序無法根據(jù)鍵值只取得一條記錄)的情況。當(dāng)根據(jù)鍵值只查詢到少數(shù)幾條匹配的記錄時,這就是一個不錯的連接類型。ref 還可以用于檢索字段使用 = 操作符來比較的時候。以下的幾個例子中,mysql將使用 ref 來處理 ref_table:
select * from ref_table where key_column=expr;
select * from ref_table,other_table
where ref_table.key_column=other_table.column;
select * from ref_table,other_table
where ref_table.key_column_part1=other_table.column
and ref_table.key_column_part2=1;
ref_or_null
這種連接類型類似 ref,不同的是mysql會在檢索的時候額外的搜索包含 null 值的記錄。這種連接類型的優(yōu)化是從mysql 4.1.1開始的,它經(jīng)常用于子查詢。在以下的例子中,mysql使用 ref_or_null 類型來處理 ref_table:
select * from ref_table
where key_column=expr or key_column is null;
詳情請看"7.2.6 how mysql optimizes is null"。
index_merge
這種連接類型意味著使用了 index merge 優(yōu)化方法。這種情況下,key字段包括了所有使用的索引,key_len 包括了使用的鍵的最長部分。詳情請看"7.2.5 how mysql optimizes or clauses"。
unique_subquery
這種類型用例如一下形式的 in 子查詢來替換 ref:
value in (select primary_key from single_table where some_expr)
unique_subquery 只是用來完全替換子查詢的索引查找函數(shù)效率更高了。
index_subquery
這種連接類型類似 unique_subquery。它用子查詢來代替 in,不過它用于在子查詢中沒有唯一索引的情況下,例如以下形式:
value in (select key_column from single_table where some_expr)
range
只有在給定范圍的記錄才會被取出來,利用索引來取得一條記錄。key 字段表示使用了哪個索引。key_len 字段包括了使用的鍵的最長部分。這種類型時 ref 字段值是 null。range 用于將某個字段和一個定植用以下任何操作符比較時 =, <>, >, >=, <, <=, is null, <=>, between, 或 in:
select * from tbl_name
where key_column = 10;
select * from tbl_name
where key_column between 10 and 20;
select * from tbl_name
where key_column in (10,20,30);
select * from tbl_name
where key_part1= 10 and key_part2 in (10,20,30);
商業(yè)源碼熱門下載www.html.org.cn
新聞熱點
疑難解答
圖片精選