2010-01-02 558 views
36

Select tables optimized away在MySQL Explain plan中的含義是什麼?MySQL中的「Select tables optimized away」的含義Explain plan

explain select count(comment_count) from wp_posts; 

+----+-------------+---------------------------+-----------------------------+ 
| id | select_type | table,type,possible_keys, | Extra      | 
| |    | key,key_len,ref,rows  |        | 
+----+-------------+---------------------------+-----------------------------+ 
| 1 | SIMPLE  | all NULLs     | Select tables optimized away| 
+----+-------------+---------------------------+-----------------------------+ 
1 row in set (0.00 sec) 

注意:explain plan輸出編輯爲易讀性。

+0

查詢結果與InnoDB表類似:SELECT MAX(k3)FROM t1 WHERE k1 ='1'AND k2 ='2',其中k1,k2和k3都是鍵的所有部分。 – Ghostrider 2010-07-23 23:05:39

回答

20

這意味着你做一個查詢,確實沒有什麼比在一個表中計算行數更多,而且該表是MyISAM表。 MyISAM表存儲在一個單獨的行數中,因此要執行此查詢,MySQL不需要查看任何錶行數據。相反,它會立即返回預先計算的行數。因此,表訪問被「優化」,查詢速度非常快。

MySQL中的其他存儲引擎(如InnoDB)也不會發生這種情況。但是,實際上,出於各種其他原因,您希望在大多數情況下使用InnoDB而不是MyISAM。 (即使沒有行計數優化這種查詢是非常非常快的。)

select count(comment_count) from wp_posts; 

這是你真正的意思嗎?這只是SELECT COUNT(*)...(假設comment_count不能是NULL,它不能或者你不會得到優化)。如果你總共需要comment_count,你應該使用SUM(comment_count),並且你不會得到「優化離開」的行爲。

+26

如果這是真的,現在不是。我從一個Innodb表上的EXPLAIN中得到這個消息 - MySQL 5.5.17。 – Riedsio 2011-09-30 19:54:53

+0

我也從一個InnoDB表上的SELECT中得到EXPLAIN的消息。 – 2012-05-04 18:52:51

+1

不是select count(fieldname)應該比select count(*)更有效嗎? – jsh 2014-01-06 15:26:52

0

很難說沒有看到您的查詢,但是這將是後果,如果你比如選擇一個恆定值 -

SELECT 1 FROM atable

或一個或多個表的大小是不需要回答這個問題。

7

這意味着表格是完全優化的查詢。你不能比這更好。

31

從MySQL文檔:

查詢只包含聚合函數(MIN(),MAX())這是 全部使用對MyISAM索引或COUNT(*)解決,並且沒有GROUP BY 條款。優化器確定只有一行應該返回。

基本上這意味着您的查詢使用的數據可直接用於MySQL,並且查詢將在恆定時間運行。

3

接受的答案和最有回報的答案似乎表明這種解釋只適用於MyISAM表格。但是我用InnoDB表格看到了這一點。

我在這裏擡頭MySQL文檔5.6版本,https://dev.mysql.com/doc/refman/5.6/en/explain-output.html#explain_extra

我沒有看到的解釋僅限於MyISAM數據。但是在COUNT(*)的特定情況下,有一個說明表示這種類型的解釋在表爲MyISAM的情況下將變爲有效。

'對於每個表(例如MyISAM,但不包括InnoDB)保持精確行數的存儲引擎,對於WHERE子句缺失或始終爲真的COUNT(*)查詢,可能會出現此額外值,並且存在沒有GROUP BY子句。(這是一個隱式分組查詢的實例,其中存儲引擎影響是否可以讀取確定性行數)。'

0

對於innodb表,我看到「Select tables optimized away」,當查找min或具有auto_increment的列的最大值。 information_schema.tables保持最大的auto_increment,所以優化器很容易看到,並且永遠不會觸及用戶表。它不適用於count之類的事情,因爲可能存在差距,所以優化器必須到用戶表中尋找答案。