2012-05-22 32 views
2

在mysql中,当你有3个表(大量数据)通过JOIN子句连接时,在SELECT的末尾有一个LIMIT子句,sql引擎产生表的笛卡尔乘积,这适用LIMIT之后,还是存在之前做过的任何优化?使用JOIN子句的LIMIT行为

我在问,因为如果我们使用大数据量JOIN操作是一个昂贵的操作。

在这种情况下,最好做JOIN并拉出所有数据,或者做SELECT WITH LIMIT子句N次?

+0

Mysql不会获取比生成结果集所需的更多数据。因此,如果可能的话 - 它只读取“LIMIT”行数量 – zerkms

+0

另一方面,有些事情*可能*会阻止MySQL提前终止 - 例如ORDER BY *可以*强制整个RS首先被实现,因为LIMIT是一个“查看操作”。 – 2012-05-22 22:56:27

+0

@pst:不是那么明显 - 因为'ORDER BY'可能使用索引 – zerkms

回答

0

不,限制功能只是一种视觉后续效果。

1/JOINS计算。

2 /在WHERE过滤器以及在HAVING滤波器处理

3 /所述LIMIT减少返回的结果的数量。如果您指定了任何ORDER BY子句,订单仍然保留。

改善您的连接以改善计算开销。

+0

你为什么这么认为? – zerkms

+0

由于要减少开销,您必须减少行扫描。限制功能不会阻止扫描,因为解析器仍然必须计算所有内容以了解它必须“限制”的内容。使用WHERE子句来减少开销。 – Sebas

+1

“仍然必须计算一切,以了解它有什么”限制“” - 这是错误的。只要获得了“LIMIT N”行,mysql就可以返回这些行 – zerkms

1

短版:这取决于查询

加长版:当你有一个LIMIT子句,它假设你有数据订购某种方式。如果您没有明确指定ORDER BY子句,您会看到,只要MySQL找到所需的行数,查询的执行就会停止。如果你有一个需要文件排序的命令,所有的数据将被排序在一个临时表中,MySQL将输出你指定的前N行。

但是,如果你强制特定的连接顺序和索引使用情况,MySQL会愉快地缩短执行时间。

+0

好的,这是有道理的,因为索引通常具有某种顺序,自动增量,日期等等。因此,如果我使用WHERE子句并且不强制mysql引擎进行排序,则可以完成内部优化 –