我重构了从另一家公司继承来的应用程序的慢速部分,以使用内部联接而不是子查询,例如:
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
“相关子查询”(即,其中where条件取决于从包含查询的行获得的值的子查询)将为每一行执行一次。一个不相关的子查询(其中where条件独立于所包含查询的子查询)将在开始时执行一次。SQL引擎自动进行此区分。
但是,是的,解释计划将为您提供肮脏的细节。来源:stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。