1

我有以下代码:

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

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

4

1 回答 1

2

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

如果没有计划,我只能假设:在您的第一个示例中,您有 2 张桌子。Mysql优化器有一些数据统计,可以正确选择和使用索引。

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

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

于 2014-08-27T12:12:53.363 回答