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

时间:2017-10-26 13:22:23

标签: mysql performance in-clause

为什么这个查询:

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);

2 个答案:

答案 0 :(得分:2)

您应该避免嵌套查询以获得更好的性能,您可以将其重写为:

select sum(column_2) 
from table1  t1
inner join table2  t2
on t1.column_1 =  t2.column_1
where column_3 = 'foo';

引用MySQL文档:

  

It can be more efficient to make use of some of these techniques rather than to use subqueries

     

例如,此查询:

     

SELECT * FROM t1 WHERE id IN(SELECT id FROM t2);

     

可以改写为:

     

SELECT DISTINCT t1。* FROM t1,t2 WHERE t1.id = t2.id;

答案 1 :(得分:0)

你问为什么,而不是选择如何让它更快。简短的回答是,这不是MySQL的查询解析器得到很好优化的领域。更简单的说,MySQL中的子查询性能是可悲的。

这并非严格属实,但通过痛苦的学习经验,90%的时间都是如此。[1] [2]在几乎任何其他数据库中,关系演算将尽可能减少子查询,包括Oracle,PosgreSQL,SQL Server和SQLite(不是详尽的列表,而是我最有经验的数据库)。原因在于关系理论的开发时间。

对于MySQL,这是一个“陷阱”区域,您在制定查询时只需要注意。通常(并非总是),尽量避免使用子查询。使用JOIN,多个查询和any reference that helps

有关查询和数据集的具体帮助,请使用EXPLAIN operator

EXPLAIN SELECT SUM(column_2) FROM table1 WHERE column_1 IN
     (SELECT column_1 FROM table2 WHERE column_3 = 'foo');

[1] MySQL Limitations Part 3: Subqueries

[2] When the subselect runs faster,从2010年开始(但还是一个很好的分析)