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

Mysql 如何重写这个嵌套查询?,mysql,sql,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

是此查询的语法

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);
同样的?

尝试使用:

请尝试使用:


此查询无效
DELETE*FROM table1
,use
DELETE FROM table1

此查询无效
DELETE*FROM table1
,use
DELETE FROM table1
否,这两个查询不相等。如果
表2中的
(var\u a,var\u b)
不是
唯一的
,则第二个可以返回重复的行

第一个问题是:

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
      )

关于性能,你能得到的最好建议是用你的数据测试、测试、再测试。尝试使用不同的索引,并找出如何阅读解释计划

您可能会发现,
IN(SELECT…FROM…
在当前MySQL优化器中的性能不是最好的(尽管我听说MariaDB计划在下一版本Maria 5.3中进行一些重大改进),而且
JOIN
EXISTS
变体通常性能更好


但是这在很大程度上取决于表上的索引。如果没有任何索引,所有的索引都会很慢。而且
查询时间<1秒
并不意味着它很快。表中有10亿行,是的,这很好。对于只有几千行的表,应该需要
时间<0.01秒

不,这两个查询如果
表2中的
(var\u a,var\u b)
不是
唯一的
,则第二个可以返回重复的行

第一个问题是:

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
      )

关于性能,你能得到的最好建议是用你的数据测试、测试、再测试。尝试使用不同的索引,并找出如何阅读解释计划

您可能会发现,
IN(SELECT…FROM…
在当前MySQL优化器中的性能不是最好的(尽管我听说MariaDB计划在下一版本Maria 5.3中进行一些重大改进),而且
JOIN
EXISTS
变体通常性能更好



但是这在很大程度上取决于表上的索引。如果没有任何索引,所有的索引都会很慢。而且
查询时间<1秒
并不意味着它很快。表中有10亿行,是的,这非常好。对于只有几千行的表,应该需要
时间<0.01秒

表有哪些数据类型?列有哪些数据类型?有哪些索引?可以发布这两个查询的解释吗?表有多少行?列有哪些数据类型?有哪些索引?可以发布这两个查询的解释吗?嗯,连接应该不会太慢。我已经对每个行数超过80000的表进行了三次连接。检查数据库的结构,并确保查询不会返回重复的rowsComment removed,我使用join语句返回另一个表的结果。这就是为什么花了5秒钟。当我在本例中所述的表上尝试它时,它花费了嗯,连接应该不会太慢。我在表上做了三次连接每个表的行数超过80000行。请检查数据库的结构,并确保查询不会返回重复的行。删除注释时,我使用join语句返回了不同表的结果。这就是为什么需要5秒钟。当我在本例中所述的表上尝试此操作时,需要+1,您完全是c正确,正如我在回答中编辑的那样。“正确”的查询取决于OP是否希望从
JOIN
中进行可能的复制,但是您和我都注意到的显式
JOIN
比他的语法更可取(尽管他的语法可能会被RDBMS转换)它的可读性更高,特别是当您有很多联接时。当联接10个表时,很容易忘记在
WHERE
上编写条件。此外,当您需要
外部联接时,也需要它。此外,它是SQL-92标准中的一个条件(现在已经有将近20年的历史了!)与
隐式连接的另一个限制是(正如@Matthew在他的回答中所说的)a
从表a、b、c、…、z中,其中a.id=b.id和…y.ff=z.ff
是一个
交叉连接,由两个或多个表组成,并应用了一些条件(而不是SQL产品实现它的方式)。使用显式连接语法,您可以从(a连接b)连接c
或从(b连接c)连接c
或从(a连接b)左连接c
等获得更大的灵活性。+1正如我在回答中编辑的那样,您完全正确。“正确”查询取决于OP是否希望从
JOIN
中复制,但您和我都提到的显式
JOIN
比他的语法更可取(尽管他的语法可能会被RDBMS转换)它的可读性更高,特别是当您有很多联接时。当联接10个表时,很容易忘记在
WHERE
上编写条件。此外,当您需要
外部联接时,也需要它。此外,它是SQL-92标准中的一个条件(现在已经有将近20年的历史了!)与
隐式连接的另一个限制是,本质上(正如@Matthew在他的回答中所说)表a,b,c,…,z中的a
,其中a.id=b.id和…y.ff=z.ff
是两个或多个表之间的
交叉连接