我重构了我们从另一家公司继承的应用程序的慢速部分,以使用内部联接而不是子查询,例如:
WHERE id IN (SELECT id FROM ...)
重构后的查询运行速度提高了大约 100 倍。(约 50 秒到约 0.3 秒)我预计会有改进,但谁能解释为什么它如此激烈? where 子句中使用的列都已编入索引。 SQL 是否每行执行一次 where 子句中的查询?
更新 - 解释结果:
区别在于“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 引擎会自动进行这种区分。
但是,是的,解释计划会给你一些肮脏的细节。
关于sql - 子查询与连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/141278/