【问题标题】:Why this MySQL query is faster when execute singly?为什么这个 MySQL 查询在单独执行时更快?
【发布时间】:2017-10-26 13:22:22
【问题描述】:

为什么要查询:

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

【问题讨论】:

  • 共享执行计划怎么样? (EXPLAIN EXTENDED)
  • 单独执行它们只会执行 2 个查询。将一个作为嵌套子查询执行会为父查询的每一行执行它。

标签: mysql performance in-clause


【解决方案1】:

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

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;

【讨论】:

    【解决方案2】:

    您问的是原因,而不是关于如何使其更快的选项。简短的回答是,这不是 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 年开始(但分析得很好)

    【讨论】:

    • IN ( SELECT ... ) 几乎总是表现不佳。通常解决方法是使用JOIN
    猜你喜欢
    • 2017-10-12
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 2012-06-11
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    相关资源
    最近更新 更多