当我执行像
这样的mysql查询时 select * from t1 where colomn1 in (select colomn1 from t2)
,
真正发生了什么?
我想知道它是否为每一行执行内部语句?
PS:我在t1中有300,000行,在t2中有50,000行,这需要花费一些时间。
答案 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)
。同样,主要是为了可读性和易维护性;查询引擎很可能会对它们进行相同的处理......
要记住的事情是
如果你只有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