Navicat 博客

联接与子查询:哪个更快? 2021 年 2 月 18 日,由 Robert Gravelle 撰写

联接(Join)和子查询(Subquery)都是用于将来自不同表的数据合并到单个结果集中。因此,它们具有许多相似之处和不同之处。一个关键的差别是性能。如果执行速度对你的业务至关重要,你应该优先考虑使用哪一种方法?请继续阅读,找出答案!

议论

毫无疑问,在联接和子查询之间,联接往往执行得更快。实际上,使用联接的查询检索时间几乎总是快过使用子查询。原因是联接通过用一个联接查询替换多个查询来减轻数据库的处理负担。因而可以更好地利用数据库的功能来搜索、筛选和排序记录。话虽如此,当你在查询中添加更多的联接时,数据库服务器必须完成更多的工作,使数据检索时间减慢。

虽然联接是从规范化的数据库检索数据的必要部分,但正确编写联接是很重要的,因为不正确的联接会导致严重的性能下降和不准确的查询结果。在某些情况下,子查询可以用最小的性能下降(如有)代替复杂的联接和并集。

子查询示例

有时,你可能无法使用子查询轻松地获得所需的数据。这是使用 MySQL 的 Sakila 示例数据库和Navicat Premium 数据库开发和管理客户端的几个示例。

示例 1:将聚合函数用作连接子句的一部分

在大多数情况下,我们使用通用字段将表进行联接。实际上,通用字段通常有相同的名称,以表明它们引用相同的信息。但这并非总是如此。在以下查询中,customer 表联接到最新的(MAX)create_date,以便查询具有最新注册日期的客户:

subquery_in_join_clause (268K)

上面的 SELECT 语句中使用了子查询,因为不能将聚合函数用作 WHERE 子句的一部分。这种巧妙的解决方法克服了这个限制!

示例 2:双重聚合

在此示例中,使用子查询来获取中间结果集,以便我们可以将 AVG() 函数应用于电影租借的 COUNT。这就是我所说的双重聚合,因为我们将聚合(AVG)应用于另一个聚合(COUNT)的结果。

aggregate_of_an_aggregate (70K)

此特定查询的速度非常快,仅花费 0.044 秒。因为内部查询返回单个(标量)值。通常,最慢的查询是需要全表扫描的查询,而这里不是这种情况。

总结

虽然联接和子查询在 SQL 语句中都各有所长,但我个人建议你尽量尝试仅使用联接编写查询。只有在没有子查询的情况下无法获取你想要的数据时,才应使用子查询。

如果你对 Navicat Premium 感兴趣,可以免费试用 14 天!

Navicat 文章
频道条目
分享
文章归档