【问题标题】:'join' or 'where not in()'? [duplicate]“加入”还是“不在()中”? [复制]
【发布时间】:2012-11-08 04:52:26
【问题描述】:

可能重复:
Join vs. subquery

我需要处理大量数据,但有时需要根据条件排除记录。

由于要检查的数据量以及将返回的数据量一次在数万个,并且会经常运行,我想知道是否有人可以阐明哪个就速度和负载而言,这种方法是最好的,所以要尽可能地让事情顺利进行

SELECT a.* 
FROM table_a as a
LEFT JOIN table_b 
  ON table_b.a_id = a.id
WHERE table_b.status <> 'new'

SELECT * 
FROM table_a
WHERE id NOT IN (
  SELECT a_id 
  FROM table_b
  WHERE status <> 'new'
) 

【问题讨论】:

  • 您确定这两个查询总是会产生相似的结果吗?
  • 这些查询是示例,因此可能不准确

标签: mysql join where-in


【解决方案1】:
SELECT * 
FROM table_a
WHERE NOT EXISTS (
  SELECT * 
  FROM table_b b 
  WHERE b.a_id = a.id AND b.status <> 'new'
) 

这个查询或 JOIN 将是更好的查询,而不是在查询中使用 IN。 将 IN 关键字用于静态数据而不是子查询。 NOT EXISTS 在查询中比 IN 好很多。

【讨论】:

    【解决方案2】:

    在大多数情况下,JOIN 比子查询更快,而且子查询更快的情况很少见。

    在 JOIN 中,RDBMS 可以创建一个更适合您的执行计划 查询并可以预测应该加载哪些数据以进行处理和 节省时间,不像子查询,它将运行所有查询和 加载所有数据以进行处理。

    子查询的好处是它们比 JOIN:这就是为什么大多数 SQL 新手更喜欢它们的原因;这是简单的方法; 但是在性能方面,JOINS 在大多数情况下甚至更好 虽然它们也不难读。

    来自here

    【讨论】:

      【解决方案3】:

      查询:

      SELECT a.* 
      FROM table_a as a
      LEFT JOIN table_b 
        ON table_b.a_id = a.id
      WHERE b.status <> 'new'
      

      会比另一个更好,因为它使用连接而不是子查询。

      您还需要检查列 table_b.a_id and table_a.id 是否也已编入索引。

      【讨论】:

      • 谢谢,是的,两者目前都已编入索引
      猜你喜欢
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 2014-07-15
      • 2021-10-31
      • 1970-01-01
      • 2013-12-31
      相关资源
      最近更新 更多