MYSQL EXPLAIN語句的extended 選項學習體會

來源:互聯網
上載者:User
MYSQL EXPLAIN語句的extended 選項學習體會2009-04-30 09:08
   mysql中有一個explain 命令可以用來分析select 語句的運行效果,例如explain可以獲得select語句
使用的索引情況、排序的情況等等。除此以外,explain 的extended 擴充能夠在原本explain的基礎
上額外的提供一些查詢最佳化的資訊,這些資訊可以通過mysql的show warnings命令得到。下面是一個最簡單的例子。
首先執行對想要分析的語句進行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)

接下來再執行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的輸出結果中我們可以看到原本的select * 被mysql最佳化成了
select `dbunit`.`account`.`id` AS `id`,`dbunit`.`account`.`name` AS `name`。
    explain extended 除了能夠告訴我們mysql的查詢最佳化能做什麼,同時也能告訴我們mysql的
查詢最佳化做不了什麼。Mysql performance的Extended EXPLAIN這篇文中中作者就利用explain
extended +show warnings 找到了mysql查詢最佳化工具中不能查詢最佳化的地方。
   從 EXPLAIN extended SELECT * FROM sbtest WHERE id>5 AND id>6 AND c="a" AND pad=c
語句的輸出我們得知mysql的查詢最佳化工具不能將id>5 和 id>6 這兩個查詢條件最佳化合并成一個 id>6。

   在mysql performance的explain extended文章中第三個例子和靜室的explain的extended選項文章中,
兩位作者也對explain extended做了進一步的實驗,從這個兩篇文中中我們可以得出結論是從
explain extend的輸出中,我們可以看到sql的執行方式,對於分析sql還是很有協助的。
下面特別摘抄了靜室的explain的extended選項這篇文章中的內容

/******************************以下代碼和分析摘抄至靜室的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)

子查詢看起來和外部的查詢沒有任何關係,為什麼MySQL顯示的是DEPENDENT SUBQUERY,
和外部相關的查詢呢?從explain extended的結果我們就可以看出原因了。

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的最佳化。
/******************************以上代碼和分析摘抄至靜室的explain的extended選項*********************/
  
   不過需要注意的一點是從EXPLAIN extended +show warnings得到“最佳化以後”的查詢語句
可能還不是最終最佳化執行的sql,或者說explain extended看到的資訊還不足以說明mysql最
終對查詢語句最佳化的結果。同樣還是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的結果中我們可以得到t1表的查詢使用的是"const"類型,也就是說mysql查詢的時候
會先由t1.id=5 找到t1.k 再利用t1.k的值去t2表中查詢資料,很顯然這樣的查詢最佳化結果沒有在
接下來的Show Warings輸出中找到。
總結
    還是引用靜室 在explain的 extended選項這篇文章中的幾句話"從explain extend的輸出中,我們可以
看到sql的執行方式,對於分析sql還是很有協助的"。

相關資源

mysql performance的 explain extended
靜室的explain extended選項
mysql 參考手冊中的EXPLAIN文法(擷取SELECT相關資訊)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.