如何让SQL查询更快?

时间:2014-02-07 11:52:42

标签: mysql sql performance cpu-load

我有大数据库。它大约有1万个字符串。我需要做这样的事情:

select * from t1 WHERE id1 NOT IN (SELECT id2 FROM t2)

但它的效果很慢。我知道我可以使用" JOIN"语法,但我无法理解。

3 个答案:

答案 0 :(得分:5)

尝试这种方式:

select * 
from t1
left join t2 on t1.id1 = t2.id
where t2.id is null

答案 1 :(得分:2)

首先,您应该优化两个表中的索引,然后使用join

答案 2 :(得分:0)

dbms可以通过不同的方式处理此任务:

它可以从t2中选择id2然后选择所有t1,其中id1不在该集合中。你建议使用IN子句。

它可以从t1中选择记录记录,如果在t2中找到匹配项,则查找每条记录。您可以使用EXISTS条款来建议这一点。

您可以外连接表然后丢弃所有匹配并保留不匹配的条目。这可能看起来很糟糕,特别是当有很多匹配时,因为你会获得大的中间数据,然后把大部分数据扔掉。但是,根据dbms的工作方式,它可能会相当快,例如,当它应用散列连接技术时。

这完全取决于表大小,匹配数,索引等,以及dbms对查询的影响。有些dbms能够完全重写您的查询以找到最佳执行计划。

说完这一切之后,你可以尝试不同的事情:

  • IN子句(SELECT DISTINCT id2 FROM t2)。 DISTINCT可以显着降低中间结果并真正加快查询速度。 (但也许你的dbms无论如何都能做到这一点来获得一个好的执行计划。)
  • 使用EXISTS子句并查看是否更快
  • Parado建议的外部联接