我只是在问自己,这是否有意义:
我有一个与几个表连接的查询,对结果进行分组(在某些列上使用GROUP_CONCAT
),然后使用HAVING
过滤掉一些结果,然后使用{{对它们进行排序1}}
ORDER BY
是这里的最后一个声明 - 所以基本上,限制仅在LIMIT
通过结果时生效,对吗?
我问自己 - 如果我已经限制了HAVING
部分,通过使用相同的FROM
进行SUBSELECT
该怎么办?但事情并非那么简单,它有点复杂:
很难想出一个有意义的例子,我只有一个不好的例子:
一辆汽车总是有四个轮子,每个轮子都有一个自己的桌子排。因此,搜索前四个轮子是没有意义的 - 我知道,MySQL可能不会。因此在LIMIT
之后LIMIT 4
意味着mysql会搜索整个表格(列出数百万个轮子),即使它可能已经停在第4位。
基本上,我的问题是 - HAVING
在下面的查询中是否有意义?
没有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?)
,也很有意义,因为MySQL在找到第一行后停止查找更多行。这就是我考虑子选择的全部原因,因为MySQL会查看整个LIMIT 1
表,而不是在第4个停止,如果carwheel
仅在LIMIT
,对吧?
答案 0 :(得分:0)
您会得到不同的结果,因为在限制from子选择时,订单是未定义的。在这两种情况下都会得到四行,但在一种情况下,您可能会得到行7,14,23,8,而在另一种情况下,您可能会得到行1,2,88,17。因此,按顺序限制结果集是有意义的例如,为了减少流量,但请记住,根据您限制的位置,您会得到不同的行。
修改:
在澄清之后,预先过滤from子句中的行是有意义的,因为这样连接的行数就会减少。第二个限制也很有用,因为使用left join
s,您可以在结果集中获得四行以上。
但可以肯定的是,哪一个更好,请对两个查询执行explain select ...
。然后,您可以比较两个选项并查看哪个更有效。