子查询和联表查询哪个效率高?

执行速度:联接(Join) >> 子查询(Subquery)

内存占用:联接(Join) >> 子查询(Subquery)

子查询的分类

  • 标量子查询( Scalar Subquery )

    SELECT c_custkey
    FROM CUSTOMER
    WHERE 1000000 < (
     SELECT SUM(o_totalprice)
     FROM ORDERS
     WHERE o_custkey = c_custkey
    )
  • 集合比较( Quantified Comparision ) ALL(全部满足) ANY(只要满足一个)

    SELECT c_name
    FROM CUSTOMER
    WHERE c_nationkey <> ALL (SELECT s_nationkey FROM SUPPLIER);
  • 存在性测试( Existential Test )EXISTS(存在) NOT EXISTS(不存在)

    SELECT c_custkey
    FROM CUSTOMER
    WHERE c_nationkey = 86 AND EXISTS(
     SELECT * FROM ORDERS
     WHERE o_custkey = c_custkey
    )

四、子查询与连接查询的使用场景比较

(1)子查询优先考虑单数据表查询,或查询两个或三个表的关联数据,并且数据量较小的情况。

(2)连接查询适用于大型数据表之间的查询,或需要在多个表之间进行关联查询的情况。

五、使用优化

当使用子查询和连接查询时,可以尝试下面几种优化措施。

(1)使用JOIN替代子查询:使用JOIN方式查询,通常比使用子查询效率更高。

SELECT *
FROM table1
JOIN (
  SELECT id
  FROM table2
  WHERE condition
) AS t2 ON t2.id = table1.id;

(2)检查SQL语句所查询的字段是否包含索引:确保查询的字段有索引,可以加速查询效率。

SELECT *
FROM table1
WHERE indexfield = 'value';

(3)避免长时间查询:对于长时间运行的查询操作,可以考虑分解成多个短时间的查询数据库操作。

一般规则:

  • 如果子查询“缩减”了行数(例如,通过 GROUP BYLIMIT),则子查询方法会更好。

  • JOIN 通常会创建比原始表更多的行。 DISTINCT 有时用于减少行数。

  • 如果外部查询有一个GROUP BYJOIN可能会创建比您想象的更多的行,并“膨胀”任何聚合(SUMCOUNT 等),从而投票支持子查询。

  • 多个子查询会导致优化效果不佳。 (从而投票支持JOIN。)

同时,如果在使用子查询时,可以使用EXISTS子句来代替IN子句,能够更快地处理数据。因此,在使用子查询的时候,需要注意语句的嵌套层数,以及是否需要使用EXISTS子句优化查询。

从效率的角度来说,联表查询更适合处理大量的数据,而子查询则更适合处理较少的数据。通过优化查询语句,可以提高查询效率。


子查询和联表查询哪个效率高?
https://shikai.info/archives/The-subquery-and-league-table-query-which-high-efficiency
作者
石 凯
发布于
2023年07月13日
许可协议