在mysql中,当你有3个表(大量数据)通过JOIN子句连接时,在SELECT的末尾有一个LIMIT子句,sql引擎产生表的笛卡尔乘积,这适用LIMIT之后,还是存在之前做过的任何优化?使用JOIN子句的LIMIT行为
我在问,因为如果我们使用大数据量JOIN操作是一个昂贵的操作。
在这种情况下,最好做JOIN并拉出所有数据,或者做SELECT WITH LIMIT子句N次?
在mysql中,当你有3个表(大量数据)通过JOIN子句连接时,在SELECT的末尾有一个LIMIT子句,sql引擎产生表的笛卡尔乘积,这适用LIMIT之后,还是存在之前做过的任何优化?使用JOIN子句的LIMIT行为
我在问,因为如果我们使用大数据量JOIN操作是一个昂贵的操作。
在这种情况下,最好做JOIN并拉出所有数据,或者做SELECT WITH LIMIT子句N次?
短版:这取决于查询
加长版:当你有一个LIMIT子句,它假设你有数据订购某种方式。如果您没有明确指定ORDER BY子句,您会看到,只要MySQL找到所需的行数,查询的执行就会停止。如果你有一个需要文件排序的命令,所有的数据将被排序在一个临时表中,MySQL将输出你指定的前N行。
但是,如果你强制特定的连接顺序和索引使用情况,MySQL会愉快地缩短执行时间。
好的,这是有道理的,因为索引通常具有某种顺序,自动增量,日期等等。因此,如果我使用WHERE子句并且不强制mysql引擎进行排序,则可以完成内部优化 –
Mysql不会获取比生成结果集所需的更多数据。因此,如果可能的话 - 它只读取“LIMIT”行数量 – zerkms
另一方面,有些事情*可能*会阻止MySQL提前终止 - 例如ORDER BY *可以*强制整个RS首先被实现,因为LIMIT是一个“查看操作”。 – 2012-05-22 22:56:27
@pst:不是那么明显 - 因为'ORDER BY'可能使用索引 – zerkms