为啥 subselect 会使 SQL 请求变慢?
Posted
技术标签:
【中文标题】为啥 subselect 会使 SQL 请求变慢?【英文标题】:Why subselect makes the SQL-request slower?为什么 subselect 会使 SQL 请求变慢? 【发布时间】:2014-08-27 11:15:48 【问题描述】:我有以下代码:
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
令人惊讶的是,第二个查询比第一个查询慢得多。我做错了什么?
【问题讨论】:
我认为这是 Exasol 中非常糟糕的优化器。合理的数据库通常会为这些查询生成相同的执行计划。 (也许它是建立在 mysql 上的,在大多数版本中都有相同的缺陷。) 【参考方案1】:您可以看到查询执行计划的差异。
没有计划我只能假设: 在您的第一个示例中,您有 2 个表。 Mysql优化器有一些数据统计,可以正确选择和使用索引。
在您的第二个查询中,您没有表,只有查询结果和优化器没有数据统计。可能在您的情况下,优化器执行没有索引或类似的查询。
我认为,在您的情况下,子查询是不好的做法。你有简单的查询,你必须使用你的第一个例子。
【讨论】:
以上是关于为啥 subselect 会使 SQL 请求变慢?的主要内容,如果未能解决你的问题,请参考以下文章
对 14K 记录使用 FOR XML AUTO, ROOT('RootName'), TYPE 会使 SQL Query 变慢