【问题标题】:Does mysql optimize the IN clausemysql是否优化IN子句
【发布时间】:2014-07-07 06:52:07
【问题描述】:

当我像

一样执行这个 mysql 查询时

select * from t1 where colomn1 in (select colomn1 from t2),

到底发生了什么?

我想知道它是否对每一行都执行内部语句

PS:我在 t1 中有 300,000 行,在 t2 中有 50,000 行,这需要很长时间。

【问题讨论】:

  • 在表 t1 和表 t2 中创建 column1 索引或唯一字段,这将有很大帮助
  • 我首先使用了 join 但它也没有用
  • 怎么没用?很慢?返回不同的数据?正如 uvais 提到的,索引将有助于连接和子查询
  • @Uriel_SVK 很慢...我等了 2-3 分钟...然后我取消了查询..

标签: mysql query-performance


【解决方案1】:

看到每个人都指出要使用JOIN,就好像它是同一件事一样,我感到非常震惊。 不是!,与此处提供的信息无关。例如。如果t2.column1 有双打呢?

=> 假设t2.column1 中没有双精度,那么是的,在所述列上放置UNIQUE INDEX 并使用 JOIN 构造,因为它更易读且更易于维护。如果它会更快;这取决于查询引擎从中得到什么。在 MSSQL 中,查询优化器(可能)会将它们视为同一件事;也许 MySQL '不那么渴望' 认识到这一点......不知道。

=> 假设t2.column1 中可以有双精度,在所述列上放置一个(非唯一)INDEX,并将WHERE IN (SELECT ..) 重写为WHERE EXISTS ( SELECT * FROM t2 WHERE t2.column1 = t1.column1)。同样,主要是为了可读性和易于维护;查询引擎很可能会以同样的方式对待它们......

要记住的事情是

  • 始终确保您有正确的索引(但不要太过分)
  • 始终意识到真正发生的将是您的 sql 代码的解释;不是“直接翻译”。您可以以不同的方式编写相同的功能来实现相同的目标。其中一些确实对不同的场景更具弹性。

如果您只有 10 行,那么几乎一切正常。如果您有 10M 行,则可能值得检查查询计划……这很可能与 10 行不同。

【讨论】:

    【解决方案2】:

    您应该在 column1 中进行索引,然后您可以使用内部连接 为indexing

    CREATE INDEX index1 ON t1 (col1);
    CREATE INDEX index2 ON t2 (col2);
    select t1.* from t1 INNER JOIN t2 on t1.colomn1=t2.colomn1
    

    【讨论】:

      【解决方案3】:

      尝试使用 INNER JOIN

      SELECT t1.*
      FROM t1
      INNER JOIN t2 ON t1.column1=t2.column1
      

      【讨论】:

        【解决方案4】:

        加入会更快,即:

        select t1.* from t1 INNER JOIN t2 on t1.colomn1=t2.colomn1
        

        【讨论】:

          猜你喜欢
          • 2011-10-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多