I have big DB. It's about 1 mln strings. I need to do something like this:
select * from t1 WHERE id1 NOT IN (SELECT id2 FROM t2)
But it works very slow. I know that I can do it using "JOIN" syntax, but I can't understand how.
I have big DB. It's about 1 mln strings. I need to do something like this:
select * from t1 WHERE id1 NOT IN (SELECT id2 FROM t2)
But it works very slow. I know that I can do it using "JOIN" syntax, but I can't understand how.
试试这个方法:
select *
from t1
left join t2 on t1.id1 = t2.id
where t2.id is null
首先,您应该优化两个表中的索引,然后您应该使用 join
dbms 可以通过不同的方式处理此任务:
它可以从 t2 中选择 id2,然后选择 id1 不在该集合中的所有 t1。您建议使用 IN 子句。
它可以从 t1 中逐条选择记录,如果在 t2 中找到匹配项,则查找每条记录。您会建议使用 EXISTS 子句。
您可以外部加入表,然后丢弃所有匹配项并保留不匹配的条目。这可能看起来很糟糕,尤其是当有很多匹配项时,因为您会获得大量的中间数据,然后将大部分数据丢弃。但是,根据 dbms 的工作方式,它可能会相当快,例如当它应用散列连接技术时。
这一切都取决于表大小、匹配数、索引等,以及 dbms 对您的查询的影响。有些 dbms 能够完全重写您的查询以找到最佳执行计划。
说了这么多,你可以尝试不同的事情: