MySQL EXPLAIN語句中的extended 選項介紹
以下的文章主要講述的是MySQL EXPLAIN語句中的extended 選項的實際應(yīng)用與具體的操作步驟,我們大家都了解MySQL數(shù)據(jù)庫中有一個explain 命令,其主要功能是用來分析select 語句的運行效果,例如explain可以獲得select語句。
使用的索引情況、排序的情況等等。除此以外,explain 的extended 擴展能夠在原本explain的基礎(chǔ)
上額外的提供一些查詢優(yōu)化的信息,這些信息可以通過MySQL的show warnings命令得到。下面是一個最簡單的例子。
首先執(zhí)行對想要分析的語句進行MySQL explain,并帶上extended選項
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)
接下來再執(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的查詢優(yōu)化能做什么,同時也能告訴我們MySQL的
查詢優(yōu)化做不了什么。MySQL performance的Extended EXPLAIN這篇文中中作者就利用explain
extended +show warnings 找到了MySQL查詢優(yōu)化器中不能查詢優(yōu)化的地方。
從 EXPLAIN extended SELECT * FROM sbtest WHERE id>***ND id>6 AND c=”a” AND pad=c
語句的輸出我們得知MySQL的查詢優(yōu)化器不能將id>5 和 id>6 這兩個查詢條件優(yōu)化合并成一個 id>6。
在MySQL performance的explain extended文章中第三個例子和靜室的MySQL explain的extended選項文章中,
兩位作者也對explain extended做了進一步的實驗,從這個兩篇文中中我們可以得出結(jié)論是從
explain extend的輸出中,我們可以看到sql的執(zhí)行方式,對于分析sql還是很有幫助的。
下面特別摘抄了靜室的explain的extended選項這篇文章中的內(nèi)容
以下代碼和分析摘抄至靜室的explain的extended選項
- 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)
子查詢看起來和外部的查詢沒有任何關(guān)系,為什么MySQL顯示的是DEPENDENT SUBQUERY,
和外部相關(guā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
- <in_optimizer>(`test`.`t`.`a`,
- <exists>(select 1 AS `Not_used` from `test`.`i`
- where (<cache>(`test`.`t`.`a`) = `test`.`i`.`b`)))
- 1 row in set (0.00 sec)
在這里MySQL改寫了SQL,做了in的優(yōu)化。
以上代碼和分析摘抄至靜室的explain的extended選項
不過需要注意的一點是從EXPLAIN extended +show warnings得到“優(yōu)化以后”的查詢語句
可能還不是最終優(yōu)化執(zhí)行的sql,或者說MySQL explain extended看到的信息還不足以說明MySQL最
終對查詢語句優(yōu)化的結(jié)果。同樣還是MySQL formance的explain Extended這篇文章的第二個
例子就說明了這種情況
- 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表的查詢使用的是”const”類型,也就是說MySQL查詢的時候
會先由t1.id=5 找到t1.k 再利用t1.k的值去t2表中查詢數(shù)據(jù),很顯然這樣的查詢優(yōu)化結(jié)果沒有在
接下來的Show Warings輸出中找到。
總結(jié)
還是引用靜室 在explain的 extended選項這篇文章中的幾句話”從MySQL explain extend的輸出中,我們可以
看到sql的執(zhí)行方式,對于分析sql還是很有幫助的”。
【編輯推薦】
- 配置MySQL與卸載MySQL實操
- MySQL 修改密碼的6個好用方案
- MySQL數(shù)據(jù)庫訪問妙招在Linux之下
- 圖解MySQL數(shù)據(jù)庫安裝與實際操作
- MySQL數(shù)據(jù)庫進行備份在Linux異構(gòu)網(wǎng)絡(luò)里