1

可能重复:
加入与子查询

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

由于要检查的数据量以及将返回的数据量一次是数万个,并且会经常运行,我想知道是否有人可以阐明哪种方法最好在速度和负载方面,尽可能保持平稳运行

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'
) 
4

3 回答 3

1

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

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

子查询的好处是它们比 JOIN 更具可读性:这就是大多数新 SQL 人更喜欢它们的原因;这是简单的方法;但是在性能方面,JOINS 在大多数情况下都更好,即使它们也不难阅读。

这里

于 2012-11-20T06:45:16.670 回答
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 好得多。

于 2012-11-20T07:02:12.747 回答
0

查询:

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是否也被索引。

于 2012-11-20T06:41:05.570 回答