2011-12-02 58 views
0

这是查询如何重写这个嵌套查询?

SELECT * FROM table1 
WHERE var_c IN(
SELECT var_a FROM table2 
WHERE var_b =55554444 
); 

的语法相当于这个?

SELECT table1.* FROM table1, table2 
WHERE (table2.var_a=table1.var_c AND table2.var_b=55554444); 

第一个需要约7-8秒运行,第二个约需0.75秒运行。当我使用Join语句时,大约需要4-5秒才能运行。

也就是这个

DELETE FROM table1 
WHERE var_c IN(
SELECT var_a FROM table2 
WHERE var_b =55554444 
); 

的语法和这样的:

DELETE table1.* FROM table1, table2 
WHERE (table2.var_a=table1.var_c AND table2.var_b=55554444); 

一样吗?

+0

表格有多少行?哪些数据类型是列?你有什么指数? –

+0

你可以发布2个查询的解释吗? –

回答

3

没有,2个查询是不等价的。第二个可以返回重复的行,如果(var_a, var_b)UNIQUEtable2

第一,虽然查询:

SELECT * 
FROM table1 
WHERE var_c IN 
     (SELECT var_a 
     FROM table2 
     WHERE var_b =55554444 
    ) 

,如果table2.var_a不包含任何NULL值,那么它等价于:

SELECT table1.* 
FROM table1 
    , table2 
WHERE table2.var_a = table1.var_c 
    AND table2.var_b = 55554444 
GROUP BY table1.PK    --- Primary Key of table1 

(最好用明确的JOIN语法编写:

SELECT table1.* 
FROM table1 
    JOIN table2 
    ON table2.var_a = table1.var_c 
WHERE table2.var_b = 55554444 
GROUP BY table1.PK    --- Primary Key of table1 

这:

SELECT * 
FROM table1 
WHERE EXISTS 
     (SELECT * 
     FROM table2 
     WHERE table2.var_b = 55554444 
      AND table2.var_a = table1.var_c 
    ) 

关于性能,你可以得到最好的建议是与您的数据再次进行测试,试验和测试。尝试使用不同的索引,并计算如何阅读EXPLAIN计划。

你可能会发现,IN (SELECT ... FROM ...)尚未与当前MySQL优化最佳性能(虽然我听说MariaDB的计划在下一版本中,玛丽亚5.3一些重大的改进)和JOINEXISTS变种执行通常是更好的。

但是,这很大程度上取决于你在表格上的索引。没有任何索引,所有这些都会很慢。而且query time < 1 sec并不意味着它很快。在桌上有十亿行,是的,这很好。对于只有几千行的表格,time < 0.01 sec应该是预期的。

+1

+1你完全正确,正如我在我的回答中编辑的那样。 “正确的”查询取决于OP是否希望可能来自'JOIN'的重复,但是显式的'JOIN'如你和我都注意到的那样优于他的语法(尽管他可能被RDBMS转换) – Matthew

+0

@MatthewPK Why'd你删除你的答案大声笑? – user784637

+0

另外,ypercube,为什么使用JOIN语法'ON table2.var_a = table1.var_c'而不是'WHERE table2.var_a = table1.var_c'更好? – user784637

1

尝试使用inner join

SELECT * FROM table1 
INNER JOIN table2 
ON table2.var_a = table1.var_c 
WHERE table2.var_b =55554444 
+1

嗯,加入不应该慢。我已经在每个超过80,000行的表上进行三连接。检查数据库的结构,并确保查询不返回重复的行 –

+0

删除了注释,我使用join语句返回不同表的结果。这就是为什么花了5秒。当我在桌面上试过时,我在这个例子中谈到它花了<1秒 – user784637

1

该查询无效DELETE * FROM table1,使用DELETE FROM table1

+0

错字,改变了。他们现在是一样的大声笑吗? – user784637