此查询的语法
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 :(得分: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