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
,useDELETE FROM table1
此查询无效DELETE*FROM table1
,useDELETE 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
是两个或多个表之间的交叉连接