为什么这个 MySQL 查询在单独执行时更快?
Why this MySQL query is faster when execute singly?
为什么查询:
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 文档:
It can be more efficient to make use of some of these techniques rather than to use subqueries
For example, this query:
SELECT * FROM t1 WHERE id IN (SELECT id FROM t2);
Can be rewritten as:
SELECT DISTINCT t1.* FROM t1, t2 WHERE t1.id=t2.id;
你问的是为什么,而不是关于如何让它更快的选项。简短的回答是,这不是 MySQL 的查询解析器优化得很好的领域。更简单地说,MySQL 中的子查询性能很差。
这并不完全正确,但根据痛苦的经验,大约 90% 的时间都是正确的。[1][2]在几乎所有其他数据库中,关系演算将尽可能减少子查询,包括 Oracle、PosgreSQL、SQL Server 和 SQLite(不是详尽的列表,但数据库的我最有经验)。原因是关系理论的发展时间太长了。
对于 MySQL,这是一个 "gotcha" 区域,您在制定查询时只需要注意这一点。通常(并非总是),尽量避免子查询。使用 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 年开始(但还是一个很好的分析)
为什么查询:
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 文档:
It can be more efficient to make use of some of these techniques rather than to use subqueries
For example, this query:
SELECT * FROM t1 WHERE id IN (SELECT id FROM t2);
Can be rewritten as:
SELECT DISTINCT t1.* FROM t1, t2 WHERE t1.id=t2.id;
你问的是为什么,而不是关于如何让它更快的选项。简短的回答是,这不是 MySQL 的查询解析器优化得很好的领域。更简单地说,MySQL 中的子查询性能很差。
这并不完全正确,但根据痛苦的经验,大约 90% 的时间都是正确的。[1][2]在几乎所有其他数据库中,关系演算将尽可能减少子查询,包括 Oracle、PosgreSQL、SQL Server 和 SQLite(不是详尽的列表,但数据库的我最有经验)。原因是关系理论的发展时间太长了。
对于 MySQL,这是一个 "gotcha" 区域,您在制定查询时只需要注意这一点。通常(并非总是),尽量避免子查询。使用 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 年开始(但还是一个很好的分析)