当返回的行数无关紧要时,在子查询上设置LIMIT

时间:2019-02-18 00:02:20

标签: mysql sql subquery innodb

im使用框架ORM运行我的查询...这是ORM查询输出的示例...它是一个关系查询

  select * from `clients` where exists 
  (select * from `transactions` where `clients`.`id` = `transactions`.`client_id`  )
  order by `id` desc limit 20 offset 02

我想知道对子查询施加限制是否会在该查询中提高性能,因为返回多少行无关紧要

喜欢

  (select * from `transactions` where `clients`.`id` = `transactions`.`client_id`  LIMIT 1 )

在这种情况下,性能是否取决于我们在子查询中选择多少行?

2 个答案:

答案 0 :(得分:2)

首先,在没有LIMIT的情况下使用ORDER BY毫无意义,因为在建议的子查询中,您没有告诉MySQL 您要保留的单个记录。

接下来,您绝对不要可能要限制存在的子查询,因为那样可能会导致它过早失败,然后才有机会找到匹配项。存在子查询的全部目的是可能扫描整个transactions表以寻找客户端匹配项。

肯定的EXISTS子句已经过优化,因为MySQL一旦找到一个匹配项就会立即停止。

答案 1 :(得分:2)

where exists 
(select * from `transactions` where `clients`.`id` = `transactions`.`client_id`  )

suquery用作EXISTS条件的参数。用英语来表示,该客户至少有一笔交易。

在处理这种情况时,MySQL通常会优化过程以仅检查子查询是否返回了至少一条记录。在这种情况下使用LIMIT是没有用的,您的RDBMS知道的更好。