当返回的行数无关紧要时在子查询上设置 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 知道得更多。
我正在使用框架 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 知道得更多。