2012-12-06 59 views
0

我只是問自己,如果這是有道理的:在GROUP BY/HAVING之前選擇限制嗎?

我有一對夫婦表的連接查詢,組結果(對部分列使用GROUP_CONCAT),然後篩選出一些結果與HAVING,之前ORDER BY

LIMIT對它們進行排序,是最後一條語句在這裏 - 所以基本上,限制纔會生效時HAVING正在經歷的結果吧?

我在問自己 - 如果我已經限制FROM部分,通過做一個SUBSELECTLIMIT相同?但它不是那麼簡單,它變得有點複雜:

很難拿出有意義的例子,我只是有一個壞的:

汽車有總是4個輪子,每個輪子都有一個自己的表格行。所以它沒有任何意義去搜索前四輪 - 我知道,MySQL可能不會。所以在HAVING之後有LIMIT 4,這意味着即使mysql可能在第四次停止時,mysql也會搜索整個表格(列出數百萬個輪子)。

基本上,我的問題是 - SUBSELECT在下面的查詢中是否有意義?

沒有SUBSELECT

SELECT * 
FROM  carwheel 
LEFT JOIN ... ON ... 
LEFT JOIN ... ON ... 
LEFT JOIN ... ON ... 
WHERE  ... 
GROUP BY ... 
HAVING ... 
ORDER BY ... 
LIMIT  4 

SUBSELECT

SELECT * 
FROM  (
      SELECT * 
      FROM carwheel 
      WHERE ... -- (first, simple filter) 
      LIMIT 4 
     ) AS carwheel 
LEFT JOIN ... ON ... 
LEFT JOIN ... ON ... 
LEFT JOIN ... ON ... 
WHERE  ... 
GROUP BY ... 
HAVING ... 
ORDER BY ... 
LIMIT  4 -- (does it make sense, to do it twice?) 

我讀過,甚至添加LIMIT 1當你想到一個單行,使得很多的意義,因爲MySQL的停止尋找找到第一個之後找到更多的行。這就是我考慮子查詢的全部原因,因爲如果LIMIT僅在HAVING之後生效,那麼MySQL會查看整個carwheel表,而不是停在第4個表,對嗎?

+1

如果您的表格已正確編制索引,則不應搜索數百萬行來查找您關心的4個,因此LIMIT子句不會產生太大影響。 – Barmar

回答

0

您會得到不同的結果,因爲當您在from subselect中進行限制時,順序未定義。在這兩種情況下,您都會得到四行,但在一種情況下,您可能會得到第7,14,23,8行,而在另一種情況下,您可能會得到第1,2,87,17行。因此,按順序限制結果集是有意義的例如,儘量減少流量,但請記住,根據您的限制,您會得到不同的行。

編輯

你澄清後,是有意義的預過濾行的FROM子句中,因爲那時加入少行處理。第二個限制也很有用,因爲使用left join可以在結果集中獲取多於四行的數據。

但是可以肯定的是,哪一個更好,請用這兩個查詢來執行explain select ...。然後,您可以比較兩個選擇並查看哪一個更有效。

+0

但是他的情況是,只有4個匹配的行開始(記住,他說「一輛車只有4個輪子」),那麼他怎麼能得到不同的行? – Barmar

+0

@Barmar是的,一輛*車*只有四個車輪,但他的桌子有數百萬行。所以他可能會得到不同的行,因爲在from子查詢中,他既沒有完成'join','group by',也沒有'order by'。 –

+0

這個問題在我的情況下實際上不是問題,因爲子查詢中的'WHERE'已經選擇了正確的4行。 HAVING和JOIN只在那裏,過濾出一些我不需要的行 - 這就是爲什麼我在想那裏的SUBSELECT的原因,我基本上已經知道這輛車和4個輪子,但是不知道他們'下降' – Katai