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

setting LIMIT on subquery when amount of returned rows doesnt matter

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

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

我想知道在这个查询中对子查询进行限制是否对性能有任何好处,因为它有多少行并不重要 returns

喜欢

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

或者这种情况下的性能不取决于我们在子查询中 select 有多少行?

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

接下来,您绝对不要 想要潜在地限制存在的子查询,因为这样您可能会导致它在给它机会找到匹配项之前过早地失败。 exists 子查询的重点是潜在地扫描整个 transactions table 寻找客户端匹配。

肯定的 EXISTS 子句已经优化,MySQL 会在找到单个匹配项后立即停止。

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

suquery 用作 EXISTS 条件的参数。用英语翻译为:此客户至少有一笔交易。

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