【发布时间】:2010-09-13 13:35:26
【问题描述】:
我重构了我们从另一家公司继承的应用程序的慢速部分,以使用内部联接而不是子查询,例如:
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
【问题讨论】:
-
Join vs. sub-query的可能重复
-
不是重复的。这个问题专门针对显着的性能差异。另一个问题更笼统,更开放,关于每种方法的优缺点以及为什么一种方法似乎更受欢迎。
-
@simhumileco 这没有任何改进,没有区别,这与作者所写的内容相反,并且对代码样式进行的那种编辑是不合适的。 When should I make edits to code?
-
嗨@philipxy,我无意干涉作者的想法,只是为了让代码片段更易读,写得更仔细。
标签: sql mysql performance database-design join