我只是問自己,如果這是有道理的:在GROUP BY/HAVING之前選擇限制嗎?
我有一對夫婦表的連接查詢,組結果(對部分列使用GROUP_CONCAT
),然後篩選出一些結果與HAVING
,之前ORDER BY
的LIMIT
對它們進行排序,是最後一條語句在這裏 - 所以基本上,限制纔會生效時HAVING
正在經歷的結果吧?
我在問自己 - 如果我已經限制FROM
部分,通過做一個SUBSELECT
與LIMIT
相同?但它不是那麼簡單,它變得有點複雜:
很難拿出有意義的例子,我只是有一個壞的:
汽車有總是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個表,對嗎?
如果您的表格已正確編制索引,則不應搜索數百萬行來查找您關心的4個,因此LIMIT子句不會產生太大影響。 – Barmar