如何重写这个嵌套查询?

时间:2011-12-02 23:23:31

标签: mysql sql

此查询的语法

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);

同样的?

3 个答案:

答案 0 :(得分:3)

不,2个查询不相同。如果(var_a, var_b)中的UNIQUE不是table2,则第二行可以返回重复的行

第一个查询:

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计划在下一版本中进行一些重大改进,Maria 5.3)以及JOIN和{{ 1}}变体通常表现更好。

但这在很大程度上取决于你在表上的索引。没有任何索引,所有索引都会很慢。而EXISTS并不意味着它很快。表中有十亿行,是的,它非常好。对于只有几千行的表,应该需要query time < 1 sec

答案 1 :(得分:1)

尝试使用inner join

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

答案 2 :(得分:1)

此查询无效DELETE * FROM table1,请使用DELETE FROM table1