可能重复:
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'
)
答案 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
也已编入索引。