在GROUP BY / HAVING之前选择限制?

时间:2012-12-06 08:01:06

标签: mysql performance limit subquery

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

我有一个与几个表连接的查询,对结果进行分组(在某些列上使用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,对吧?

1 个答案:

答案 0 :(得分:0)

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

修改

在澄清之后,预先过滤from子句中的行是有意义的,因为这样连接的行数就会减少。第二个限制也很有用,因为使用left join s,您可以在结果集中获得四行以上。

但可以肯定的是,哪一个更好,请对两个查询执行explain select ...。然后,您可以比较两个选项并查看哪个更有效。