【发布时间】:2025-12-21 00:30:15
【问题描述】:
在以下查询中:
SELECT column_a, column_b FROM table_a WHERE
column_b IN (SELECT b_id FROM table_b)
子查询 SELECT b_id FROM table_b 是否由 SQL 解析器缓存,或者提前执行查询是否会更快,将其保存为变量(例如在 PHP 中),然后将这些值作为 CSV 字符串传递?
例如
SELECT column_a, column_b FROM table_a WHERE
column_b IN (1,3,4,6,8,10,16,18)
【问题讨论】:
-
将
IN与子查询一起使用是一个糟糕的主意。您最好通过连接在此处获得所需的结果,因为查询本质上是等连接。SELECT column_a, column_b FROM table_a JOIN table_b ON column_b = b_id -
@TimSeguine:为什么这是一个糟糕的主意?如果
table_b是一个N:M 关系表,那么如果使用JOIN,则会从table_a获得多行。这可能是不需要的。 -
@naitsirch 这是一个坏主意,因为 MySQL 对依赖子查询的支持很差。如果你能以任何方式避免它们,你可能应该这样做。一个精心挑选的
GROUP BY可以在大多数情况下消除无关结果。 -
我们在问题中没有依赖(我认为您的意思是 correlated)子查询(有关相关子查询的解释,请参阅 here)。据我所知,这个查询应该和
JOIN一样高效,因为它只能执行一次。 -
@naitsirch 你是对的,它不相关。尽管如此,旧版本的 MySQL 有时会非常糟糕地优化
IN子查询(评估外部表的每一行的整个子查询,在这种情况下是 a)。当我说老时,我的意思是到 5.5。如果可能,使用JOIN重写通常是一个非常好的主意。
标签: mysql sql sql-server database optimization