开发者社区> 问答> 正文

子查询与联接

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

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

更新 -说明结果:

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

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

展开
收起
保持可爱mmm 2020-05-10 20:20:42 426 0
1 条回答
写回答
取消 提交回答
  • “相关子查询”(即,其中where条件取决于从包含查询的行获得的值的子查询)将为每一行执行一次。一个不相关的子查询(其中where条件独立于所包含查询的子查询)将在开始时执行一次。SQL引擎自动进行此区分。

    但是,是的,解释计划将为您提供肮脏的细节。来源:stack overflow

    2020-05-10 20:23:13
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载