我有以下代码:
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
令人惊讶的是,第二个查询明显慢于第一个查询。我做错了什么?
答案 0 :(得分:2)
您可以看到查询执行计划的不同。
没有计划,我只能假设: 在第一个示例中,您有2个表。 Mysql优化器有一些数据统计,可以正确选择和使用索引。
在您的第二个查询中,您没有表格,只有查询结果和优化程序没有数据统计信息。可能在你的情况下,优化器执行没有索引的查询或类似的东西。
我认为,在您的情况下,子查询是不好的做法。你有简单的查询,你必须使用你的第一个例子。