回答

收藏

子查询vs联接

技术问答 技术问答 103 人阅读 | 0 人回复 | 2023-09-13

我重建了从另一家公司继承的应用程序的缓慢部分,使用内部连接而不是子查询,例如:
4 j3 |" M$ x7 b$ x' a5 z" s; D# qWHERE id IN (SELECT id FROM ...)重构后的查询运行速度提高了约100倍。6 G, i6 ]7 n/ P0 W" X
(约50秒,约0.3秒),我希望有所改善,但谁能解释为什么这么激烈呢?where索引已建立在子句中使用的列中。SQL是否在where每次在句子中执行查询?' ?% P7 [2 g. @# I5 Z" k
更新    -说明结果:: ]' E0 N9 Y, G3 e/ D
区别在于())id查询的第二部分-
3 c2 f& i% a+ N* \  U2 [3 H2   DEPENDENT SUBQUERY  submission_tags ref st_tag_id   st_tag_id  4    const   2966                                                                                                                                                                                                                                                      Using wherevs 1带连接的索引行:
+ }# u6 |& s+ L/ M2 P* P/ B                SIMPLE  s   eq_ref  PRIMARY PRIMARY 4   newsladder_production.st.submission_id  1   Using index               
' y& L, z$ |3 g" c* D    解决方案:                                                                + V2 }/ k& _5 y( u+ V
                                                                相关子查询(即,其中where条件取决于从包含查询的行中获得的值的子查询)将为每行执行一次。一个不相关的子查询(包括where包含查询的子查询将在开始时执行一次。SQL发动机会自动区分这一点。
$ z! k$ y1 a* U# N( H1 @& s7 O但是,是的,解释计划将为您提供肮脏的细节。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则