为什么subselect会使SQL请求变慢?

为什么subselect会使SQL请求变慢?,sql,join,subquery,sql-optimization,exasolution,Sql,Join,Subquery,Sql Optimization,Exasolution,我有以下代码: select * from table_1 join table_2 on table_1.col1 = table_2.col1 where table_2.col2 = 1 此查询有效,并提供我期望的结果。现在我想优化这个查询。我的想法是,在连接两个表之前,尽量减少第二个查询。换句话说,我认为“删除”行并连接较小的表应该比连接大表然后从中选择所需的更快。我通过以下方式实现我的想法: select * from tabl

我有以下代码:

select
    *
from
    table_1
join
    table_2
on
    table_1.col1 = table_2.col1
where
    table_2.col2 = 1
此查询有效,并提供我期望的结果。现在我想优化这个查询。我的想法是,在连接两个表之前,尽量减少第二个查询。换句话说,我认为“删除”行并连接较小的表应该比连接大表然后从中选择所需的更快。我通过以下方式实现我的想法:

select
    *
from
    table_1
join
    (
    select
        *
    from
        table_2
    where
        table_2.col2 = 1
    )
on
    table_1.col1 = table_2.col1

令人惊讶的是,第二个查询比第一个查询慢得多。我做错了什么?

您可以看到查询执行计划中的差异

没有计划,我只能假设: 在第一个示例中,您有两个表。Mysql优化器具有一定的数据统计功能,能够正确选择和使用索引

在第二个查询中,并没有表,只有查询结果和优化器并没有数据统计。可能在您的情况下,优化器执行查询时没有索引或类似的内容


我认为,在您的情况下,子查询是一种糟糕的做法。您有一个简单的查询,必须使用第一个示例。

在Exasol中,我认为这是一个非常糟糕的优化器。合理的数据库通常会为这些查询生成相同的执行计划。(也许它是基于MySQL构建的,而MySQL在大多数版本中都有相同的缺陷。)