'加入'或'不在()的地方?

时间:2012-11-20 06:39:12

标签: mysql join where-in

  

可能重复:
  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'

OR

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

3 个答案:

答案 0 :(得分:1)

  

在大多数情况下,JOIN比子查询更快,并且子查询的速度非常快。

     

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

     

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

来自here

答案 1 :(得分: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 :(得分: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也已编入索引。