为什么进行此查询:
select sum(column_2) from table1 where column_1 in
(select column_1 from table2 where column_3 = 'foo');
需要几分钟才能执行,所以如果我单独执行两个查询会更快吗?
例如:
select column_1 from table2 where column_3 = 'foo'
结果xxx
select sum(column_2) from table1 where column_1 in (xxx);
为了避免嵌套查询以获得更好的性能,可以将其重写为:
select sum(column_2)
from table1 t1
inner join table2 t2
on t1.column_1 = t2.column_1
where column_3 = 'foo';
引用MySQL文档:
使用其中一些技术比使用子查询更有效
例如,此查询:
SELECT*FROM t1 WHERE id IN(SELECT id FROM t2);
可以重写为:
从t1、t2中选择区别t1.*,其中t1.id=t2.id;
您问的是为什么,而不是如何加快速度的选项。简单的回答是,MySQL的查询解析器在这方面并没有得到很好的优化。更简单地说,MySQL中的子查询性能很差。
严格来说,这并不是真的,但通过痛苦的学习经历,大约90%的时间都是真的。[1] [2]在几乎任何其他数据库中,关系演算都会尽可能减少子查询,包括Oracle、PosgreSQL、SQL Server和SQLite(不是详尽的列表,而是我最有经验的数据库)。究其原因,纯粹是关系理论的发展时间。
对于MySQL来说,这是一个"gotcha"领域,您只需要在制定查询时意识到这一点。通常(并非总是),尽量避免子查询。使用JOIN、多个查询和任何有帮助的引用。
有关查询和数据集的具体帮助,请使用EXPLAIN运算符:
EXPLAIN SELECT SUM(column_2) FROM table1 WHERE column_1 IN
(SELECT column_1 FROM table2 WHERE column_3 = 'foo');
[1] MySQL限制第3部分:子查询
[2] 当子选择运行得更快时,从2010年开始(但这是一个很好的分析)