查询优化:用联接替换子查询的巨大影响
最近的应用程序重构通过用内连接替换子查询显着提高了性能。原始代码在 WHERE
子句中使用了子查询:
<code class="language-sql">WHERE id IN (SELECT id FROM ...)</code>
这一变化带来了惊人的 100 倍加速,将执行时间从 50 秒降至 0.3 秒。 这就引出了一个问题:为什么会有如此巨大的差异?
关键在于理解子查询的行为。 相关子查询(其中子查询的 WHERE
子句取决于外部查询的值)针对外部查询中的每一行重复执行。 这种重复执行的效率极低。 相反,不相关的子查询仅执行一次。
原始子查询是相关的。 对于处理的每一行,数据库都必须执行子查询,从而导致大量查找。
用内部联接替换子查询允许数据库有效地利用索引查找。连接条件(例如,submission_id = st_tag_id
)允许对每个符合条件的行进行单个索引查找。这大大减少了数据库访问,解释了性能的飞跃。
教训? 仔细考虑子查询与连接对于 SQL 查询优化至关重要。了解相关和非相关子查询及其性能影响,使开发人员能够编写更快、更高效的数据库查询。
以上是子查询与联接:为什么用联接替换子查询会带来 100 倍的性能提升?的详细内容。更多信息请关注PHP中文网其他相关文章!