猿问

子查询与联接

子查询与联接

我重构了我们从另一家公司继承的应用程序中的一个缓慢部分,以使用内部连接,而不是像以下这样的子查询:

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

vs1索引行与联接:

    SIMPLE  s   eq_ref  PRIMARY PRIMARY 4   newsladder_production.st.submission_id  1   Using index



ITMISS
浏览 604回答 3
3回答

忽然笑

下面是一个例子子查询在MySQL6.0中进行评估.新的优化器将此类子查询转换为联接。

MYYA

在通过查询优化器对DataSet运行查询之前,优化器尝试组织查询,以便尽可能快地从结果集中删除多个元组(行)。通常,当您使用子查询(特别是糟糕的查询)时,在外部查询开始运行之前,不能将元组从结果集中删除。在没有看到查询的情况下,很难说出原始版本的糟糕之处,但我猜这是优化器无法做得更好的事情。运行“解释”将显示用于检索数据的优化器方法。
随时随地看视频慕课网APP
我要回答