mysql是否优化了IN子句

时间:2014-05-19 10:38:02

标签: mysql query-performance

当我执行像

这样的mysql查询时

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

真正发生了什么?

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

PS:我在t1中有300,000行,在t2中有50,000行,这需要花费一些时间。

4 个答案:

答案 0 :(得分: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行不同。

答案 1 :(得分:0)

加入会更快,即:

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

答案 2 :(得分:0)

尝试使用INNER JOIN

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

答案 3 :(得分:0)

您应该在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