使用两个查询而不是子查询来提高性能?

时间:2017-05-16 00:17:55

标签: mysql sql

我使用InnoDB和MySQL

嗨,

我有两张桌子: 第一个称为adtells,包含很少的元素,很少更新。 第二个包含很多元素,并在常规基础上获得新的插入。

第二个表存储,哪个用户隐藏了第一个表中的元素。我想我无法加入这些表格。

我的第一个查询是这样的: SELECT xy FROM firstTable WHERE 1 NOT IN(SELECT abc FROM secondTable)

我的第二种方法是两个查询: 第一个选择第二个表中所有需要的元素。通过这些结果,我访问了第一个表。

您对这些方法有何看法?第一个或第二个是更高效的还是你还有其他想法吗?

对给定示例的进一步说明: 表格1: id |内容 表2: userId,tableOneId

第二个表包含从给定用户到第一个表的元素的赋值。如果存在分配,则上述查询不应检索受影响的tableOneId。

很想收到你的消息!

1 个答案:

答案 0 :(得分:1)

使用NOT EXISTS

SELECT t1.* FROM firstTable T1
  WHERE 
    NOT EXISTS 
        (SELECT 1 FROM secondTable T2 where t2.id = t1.id)

NOT EXISTS / EXISTS将在找到第一个匹配时终止

IN将搜索所有行,无论匹配多少...如果有100个匹配则再进行100次迭代。

  

基于规则优化器:

     

当子查询结果非常好时,EXISTS比IN快得多   大。当子查询结果非常好时,IN比EXISTS快   小。基于成本优化器:

     

没有区别。

Difference between EXISTS and IN in SQL?