? ? MySQL數(shù)據(jù)庫(kù)中有一個(gè)explain 命令蚀之,其主要功能是用來(lái)分析select 語(yǔ)句的運(yùn)行效果,例如explain可以獲得select語(yǔ)句使用的索引情況日缨、排序的情況等等。除此以外掖看,explain 的extended 擴(kuò)展能夠在原本explain的基礎(chǔ)上額外的提供一些查詢(xún)優(yōu)化的信息匣距,這些信息可以通過(guò)MySQL的show warnings命令得到。下面是一個(gè)最簡(jiǎn)單的例子哎壳。
首先執(zhí)行對(duì)想要分析的語(yǔ)句進(jìn)行explain毅待,并帶上extended選項(xiàng)
mysql> explain?extended?select * from account\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: account
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 1
filtered: 100.00
Extra:
1 row in set, 1 warning (0.00 sec)
接下來(lái)再執(zhí)行Show Warnings
mysql> show warnings\G;
*************************** 1. row ***************************
Level: Note
Code: 1003
Message: select `dbunit`.`account`.`id` AS `id`,`dbunit`.`account`.`name` AS `name` from `dbunit`.`account`
1 row in set (0.00 sec)
從 show warnings的輸出結(jié)果中我們可以看到原本的select * 被mysql優(yōu)化成了
select `dbunit`.`account`.`id` AS `id`,`dbunit`.`account`.`name` AS `name`。
explain extended 除了能夠告訴我們mysql的查詢(xún)優(yōu)化能做什么归榕,同時(shí)也能告訴我們mysql的
查詢(xún)優(yōu)化做不了什么尸红。Mysql performance的Extended EXPLAIN這篇文中中作者就利用explain
extended +show warnings 找到了mysql查詢(xún)優(yōu)化器中不能查詢(xún)優(yōu)化的地方。
從 EXPLAIN extended SELECT * FROM sbtest WHERE id>5 AND id>6 AND c="a" AND pad=c
語(yǔ)句的輸出我們得知mysql的查詢(xún)優(yōu)化器不能將id>5 和 id>6 這兩個(gè)查詢(xún)條件優(yōu)化合并成一個(gè) id>6刹泄。
在mysql performance的explain extended文章中第三個(gè)例子和靜室的explain的extended選項(xiàng)文章中外里,
兩位作者也對(duì)explain extended做了進(jìn)一步的實(shí)驗(yàn),從這個(gè)兩篇文中中我們可以得出結(jié)論是從
explain extend的輸出中特石,我們可以看到sql的執(zhí)行方式盅蝗,對(duì)于分析sql還是很有幫助的。
下面特別摘抄了靜室的explain的extended選項(xiàng)這篇文章中的內(nèi)容
/******************************以下代碼和分析摘抄至靜室的explain的extended選項(xiàng)**************/
mysql>explain extended select * from t where a in (select b from i);
+----+--------------------+-------+------+
| id | select_type??????? | table | type |
+----+--------------------+-------+------+
| 1 | PRIMARY??????????? | t???? | ALL |
| 2 | DEPENDENT SUBQUERY | i???? | ALL |
+----+--------------------+-------+------+
2 rows in set, 1 warning (0.01 sec)
子查詢(xún)看起來(lái)和外部的查詢(xún)沒(méi)有任何關(guān)系姆蘸,為什么MySQL顯示的是DEPENDENT SUBQUERY墩莫,
和外部相關(guān)的查詢(xún)呢?從explain extended的結(jié)果我們就可以看出原因了乞旦。
mysql>show warnings\G
*************************** 1. row ***************************
Level: Note
Code: 1003
Message: select `test`.`t`.`a` AS `a`,`test`.`t`.`b` AS `b`,`test`.`t`.`c` AS `c`
from `test`.`t` where
(`test`.`t`.`a`,
(select 1 AS `Not_used` from `test`.`i`
where ((`test`.`t`.`a`) = `test`.`i`.`b`)))
1 row in set (0.00 sec)
在這里MySQL改寫(xiě)了SQL贼穆,做了in的優(yōu)化。
/******************************以上代碼和分析摘抄至靜室的explain的extended選項(xiàng)*********************/
不過(guò)需要注意的一點(diǎn)是從EXPLAIN extended +show warnings得到“優(yōu)化以后”的查詢(xún)語(yǔ)句
可能還不是最終優(yōu)化執(zhí)行的sql兰粉,或者說(shuō)explain extended看到的信息還不足以說(shuō)明mysql最
終對(duì)查詢(xún)語(yǔ)句優(yōu)化的結(jié)果故痊。同樣還是mysql formance的explain Extended這篇文章的第二個(gè)
例子就說(shuō)明了這種情況
/*****************************************************************************************************/
mysql> EXPLAIN extended SELECT t1.id,t2.pad FROM sbtest t1, sbtest t2 WHERE t1.id=5
AND t2.k=t1.k;
+----+-------------+-------+-------+---------------+---------+---------+-------+-------+-------+
| id | select_type | TABLE | type | possible_keys | KEY???? | key_len | ref?? | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+-------+-------+-------+
| 1 | SIMPLE????? | t1??? | const | PRIMARY,k???? | PRIMARY | 4?????? | const |???? 1 |?????? |
| 1 | SIMPLE????? | t2??? | ref?? | k???????????? | k?????? | 4?????? | const | 55561 |?????? |
+----+-------------+-------+-------+---------------+---------+---------+-------+-------+-------+
2 rows IN SET, 1 warning (0.00 sec)
mysql> SHOW warnings \G
*************************** 1. row ***************************
Level: Note
Code: 1003
Message: SELECT `test`.`t1`.`id` AS `id`,`test`.`t2`.`pad` AS `pad` FROM `test`.`sbtest` `t1`
JOIN `test`.`sbtest` `t2` WHERE ((`test`.`t2`.`k` = `test`.`t1`.`k`) AND (`test`.`t1`.`id` = 5))
1 row IN SET (0.00 sec)
/*************************************************************************************************/
從Explain的結(jié)果中我們可以得到t1表的查詢(xún)使用的是"const"類(lèi)型,也就是說(shuō)mysql查詢(xún)的時(shí)候
會(huì)先由t1.id=5 找到t1.k 再利用t1.k的值去t2表中查詢(xún)數(shù)據(jù)玖姑,很顯然這樣的查詢(xún)優(yōu)化結(jié)果沒(méi)有在
接下來(lái)的Show Warings輸出中找到愕秫。
總結(jié)
還是引用靜室在explain的 extended選項(xiàng)這篇文章中的幾句話(huà)"從explain extend的輸出中慨菱,我們可以
看到sql的執(zhí)行方式,對(duì)于分析sql還是很有幫助的"戴甩。