繁体   English   中英

为什么单独执行时此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文档:

使用其中一些技术比使用子查询可能更有效

例如,此查询:

SELECT * FROM t1 id in(输入id from t2);

可以改写为:

选择DISTINCT t1。*从t1,t2到t1.id = t2.id;

您问的是原因,而不是选择如何使其更快。 简短的答案是,这不是MySQL的查询解析器得到很好优化的领域。 更简单地说,MySQL中的子查询性能是可悲的。

严格来说,这不是正确的,但是通过痛苦的学习经验,大约90%的时间都是正确的。[1] [2] 在几乎所有其他数据库中,关系演算将尽可能减少子查询,包括Oracle,PosgreSQL,SQL Server和SQLite(不是详尽的列表,而是我经验最丰富的数据库)。 原因是关系理论的发展时间太长。

对于MySQL,这是一个“陷阱”区域,您在制定查询时只需要了解该区域。 通常(并非总是如此),请尝试避免子查询。 使用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年开始,子选择的运行速度更快 (但分析不错)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM