为了账号安全,请及时绑定邮箱和手机立即绑定

子查询与联接

子查询与联接

ITMISS 2019-07-13 09:20:34
子查询与联接我重构了我们从另一家公司继承的应用程序中的一个缓慢部分,以使用内部连接,而不是像以下这样的子查询: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 wherevs1索引行与联接:    SIMPLE  s   eq_ref  PRIMARY PRIMARY 4   newsladder_production.st.submission_id  1   Using index
查看完整描述

3 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

下面是一个例子子查询在MySQL6.0中进行评估.

新的优化器将此类子查询转换为联接。


查看完整回答
反对 回复 2019-07-13
?
MYYA

TA贡献1868条经验 获得超4个赞

在通过查询优化器对DataSet运行查询之前,优化器尝试组织查询,以便尽可能快地从结果集中删除多个元组(行)。通常,当您使用子查询(特别是糟糕的查询)时,在外部查询开始运行之前,不能将元组从结果集中删除。

在没有看到查询的情况下,很难说出原始版本的糟糕之处,但我猜这是优化器无法做得更好的事情。运行“解释”将显示用于检索数据的优化器方法。


查看完整回答
反对 回复 2019-07-13
  • 3 回答
  • 0 关注
  • 603 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信