Explain命令在解決數(shù)據(jù)庫(kù)性能上是第一推薦使用命令,大部分的性能問(wèn)題可以通過(guò)此命令來(lái)簡(jiǎn)單的解決,Explain可以用來(lái)查看SQL語(yǔ)句的執(zhí)行效 果,可以幫助選擇更好的索引和優(yōu)化查詢語(yǔ)句,寫出更好的優(yōu)化語(yǔ)句。
Explain語(yǔ)法:
EXPLAIN tbl_name或:EXPLAIN [EXTENDED] SELECT select_options
前者可以得出一個(gè)表的字段結(jié)構(gòu)等等,后者主要是給出相關(guān)的一些索引信息,而今天要講述的重點(diǎn)是后者。
例:
| EXPLAIN SELECT sum(amount) FROM customer a, payment b WHERE1 = 1 AND a.customer_id = b.customer_id AND a.email = 'JANE.BENNETT@sakilacustomer.org'; | 
執(zhí)行結(jié)果:

下面對(duì)各個(gè)屬性進(jìn)行了解:
1、id:這是SELECT的查詢序列號(hào)
2、select_type:select_type就是select的類型,可以有以下幾種:
SIMPLE:簡(jiǎn)單SELECT(不使用UNION或子查詢等)
PRIMARY:最外面的SELECT
UNION:UNION中的第二個(gè)或后面的SELECT語(yǔ)句
DEPENDENT UNION:UNION中的第二個(gè)或后面的SELECT語(yǔ)句,取決于外面的查詢
UNION RESULT:UNION的結(jié)果。
SUBQUERY:子查詢中的第一個(gè)SELECT
DEPENDENT SUBQUERY:子查詢中的第一個(gè)SELECT,取決于外面的查詢
DERIVED:導(dǎo)出表的SELECT(FROM子句的子查詢)
3、table:顯示這一行的數(shù)據(jù)是關(guān)于哪張表的實(shí)際的表名(如select * from customer;) 或表的別名 (如 select * from customer a);
4、type:這列最重要,顯示了連接使用了哪種類別,有無(wú)使用索引,是使用Explain命令分析性能瓶頸的關(guān)鍵項(xiàng)之一。
結(jié)果值從好到壞依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
一般來(lái)說(shuō),得保證查詢至少達(dá)到range級(jí)別,最好能達(dá)到ref,否則就可能會(huì)出現(xiàn)性能問(wèn)題。
all: 意味著從表的第1行,往后,逐行做全表掃描.,運(yùn)氣不好掃描到最后一行.
index: 比all性能稍好一點(diǎn),
通俗的說(shuō): all 掃描所有的數(shù)據(jù)行,相當(dāng)于data_all index 掃描所有的索引節(jié)點(diǎn),相當(dāng)于index_all
注:all是沿著磁盤掃描,index是沿著索引掃描
range: 意思是查詢時(shí),能根據(jù)索引做范圍的掃描
explain select * from customer where customer_id > 4;

index_subquery 在子查詢中,基于除唯一索引之外的索引進(jìn)行掃描;
unique_subquery 在子查詢中,基于唯一索引進(jìn)行掃描,類似于EQ_REF;
index_merge 多重范圍掃描。兩表連接的每個(gè)表的連接字段上均有索引存在且索引有序,結(jié)果合并在一起。適用于作集合的并、交操作。
新聞熱點(diǎn)
疑難解答
圖片精選