我只是在问自己,这是否有意义:
我有一个查询,它连接几个表,对结果进行分组(在某些列上使用GROUP_CONCAT ),然后使用HAVING过滤掉一些结果,然后使用ORDER BY对它们进行排序
LIMIT是这里的最后一条语句,所以基本上,限制只在HAVING遍历结果时生效,对吗?
我在问自己-如果我已经限制了FROM部分,通过使用相同的LIMIT执行SUBSELECT会怎么样?但这并不是那么简单,它变得有点复杂:
很难想出一个有意义的例子,我只有一个糟糕的例子:
一辆车总是有4个轮子,每个轮子都有自己的表行。因此,搜索通过前4个轮子是没有意义的-我知道,MySQL可能不会。因此,在HAVING之后使用LIMIT 4,将意味着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在找到第一行后会停下来寻找更多的行。这就是我考虑subselect的全部原因,因为如果LIMIT只在HAVING之后生效,那么MySQL将遍历整个carwheel表,而不是在第4个表停止,对吧?
发布于 2012-12-06 16:07:57
您会得到不同的结果,因为当您在from子选择中进行限制时,顺序是未定义的。在这两种情况下,您都会得到四行,但在一种情况下,您可能会得到第7、14、23、8行,而在另一种情况下,您可能会得到第1、2、88、17行。因此,限制结果集以最小化通信量是有意义的,但请记住,根据您限制的位置,您会得到不同的行。
编辑
澄清之后,在from子句中预过滤行是有意义的,因为这样连接需要处理的行数就更少了。第二个限制也很有用,因为使用left join可以在结果集中获得四行以上的数据。
但要确定哪一个更好,请对这两个查询执行explain select ...。然后,您可以比较这两个选择,看看哪一个更有效。
https://stackoverflow.com/questions/13739276
复制相似问题