0

我只是在问自己,这是否有意义:

我有一个与几个表连接的查询,对结果进行分组(GROUP_CONCAT在某些列上使用),然后用 过滤掉一些结果HAVING,然后用ORDER BY

,LIMIT是这里的最后一条语句 - 所以基本上,限制仅在查看结果时才生效HAVING,对吧?

我在问自己——如果我已经通过同样的方式来限制FROM部分怎么办?但这并不是那么简单,它变得有点复杂:SUBSELECTLIMIT

很难想出一个有意义的例子,我只有一个不好的例子:

一辆车总是有 4 个轮子,每个轮子都有自己的桌子排。所以搜索前 4 个轮子是没有意义的——我知道,MySQL 可能没有。因此,在 ,LIMIT 4之后HAVING意味着 mysql 搜索整个表(列出数百万个轮子),即使它本可以在 4 号停止。

基本上,我的问题是 -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 在找到第一行后停止寻找更多行。这就是我考虑子选择的全部原因,因为 MySQL 会查看整个carwheel表,而不是在第 4 位停止,如果LIMIT仅在 之后生效HAVING,对吗?

4

1 回答 1

0

您会得到不同的结果,因为当您限制 from 子选择时,顺序是未定义的。在这两种情况下你都会得到四行,但在一种情况下你可能会得到第 7、14、23、8 行,在另一种情况下你可能会得到第 1、2、88、17 行。因此,按顺序限制结果集是有意义的例如,尽量减少流量,但请记住,根据您的限制位置,您会得到不同的行。

编辑

在你澄清之后,在你的 from 子句中预过滤行是有意义的,因为这样连接就有更少的行需要处理。第二个限制也很有用,因为使用left joins 您可以在结果集中获得超过四行。

但可以肯定的是,哪个更好,explain select ...对这两个查询进行一次。然后,您可以比较这两种选择,看看哪一种更有效。

于 2012-12-06T08:07:57.283 回答