代码之家  ›  专栏  ›  技术社区  ›  max

当返回的行数无关紧要时对子查询设置限制

  •  0
  • max  · 技术社区  · 5 年前

      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 回复  |  直到 5 年前
        1
  •  2
  •   GMB    5 年前
    where exists 
    (select * from `transactions` where `clients`.`id` = `transactions`.`client_id`  )
    

    suquery用作 EXISTS 条件。在英语中,这可以翻译为:这个客户至少有一笔交易。

    在处理这种类型的条件时,MySQL通常会优化处理过程,只检查子查询是否返回了至少一条记录。使用 LIMIT

        2
  •  2
  •   Tim Biegeleisen    5 年前

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

    接下来,你绝对 希望潜在地限制存在的子查询,因为这样可能会导致它过早失败,然后给它找到匹配的机会。存在的子查询的整个点是潜在地扫描整个 transactions 查找客户端匹配项的表。

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