为什么这个MySQL查询在单独执行时更快



为什么进行此查询:

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年开始(但这是一个很好的分析)

相关内容

  • 没有找到相关文章

最新更新