我重构了从另一家公司继承的应用程序的一个缓慢部分,以使用内部联接而不是子查询,例如:
WHERE id IN (SELECT id FROM ...)
重构后的查询运行速度提高了约 100 倍。(~50 秒到~0.3)我预计会有改进,但谁能解释为什么它如此剧烈? where 子句中使用的列都已建立索引。 SQL是否每行执行一次where子句中的查询?
Update- 解释结果:
区别在于“where id in ()”查询的第二部分 -
2 DEPENDENT SUBQUERY submission_tags ref st_tag_id st_tag_id 4 const 2966 Using where
对比 1 个带连接的索引行:
SIMPLE s eq_ref PRIMARY PRIMARY 4 newsladder_production.st.submission_id 1 Using index
“相关子查询”(即其中 where 条件取决于从包含查询的行获取的值的子查询)将为每一行执行一次。非相关子查询(其中 where 条件独立于包含查询)将在开始时执行一次。 SQL 引擎自动进行这种区分。
但是,是的,解释计划会给你一些肮脏的细节。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)