小编典典

子查询vs联接

sql

我重构了从另一家公司继承来的应用程序的慢速部分,以使用内部联接而不是子查询,例如:

WHERE id IN (SELECT id FROM ...)

重构后的查询运行速度提高了约100倍。
(约50秒,约0.3秒),我期望有所改善,但谁能解释为什么如此剧烈?where子句中使用的列均已建立索引。SQL是否在where子句中每行执行一次查询?

更新 -说明结果:

区别在于“(())中的id”查询的第二部分-

2   DEPENDENT SUBQUERY  submission_tags ref st_tag_id   st_tag_id   4   const   2966    Using where

vs 1带有连接的索引行:

    SIMPLE  s   eq_ref  PRIMARY PRIMARY 4   newsladder_production.st.submission_id  1   Using index

阅读 149

收藏
2021-05-05

共1个答案

小编典典

“相关子查询”(即,其中where条件取决于从包含查询的行获得的值的子查询)将为每一行执行一次。一个不相关的子查询(其中where条件独立于所包含查询的子查询)将在开始时执行一次。SQL引擎会自动进行此区分。

但是,是的,解释计划会为您提供肮脏的细节。

2021-05-05