回答

收藏

子查询vs联接

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

我重建了从另一家公司继承的应用程序的缓慢部分,使用内部连接而不是子查询,例如:6 a7 i/ h5 p8 U
WHERE id IN (SELECT id FROM ...)重构后的查询运行速度提高了约100倍。
! i' p6 S2 u8 k5 @; X(约50秒,约0.3秒),我希望有所改善,但谁能解释为什么这么激烈呢?where索引已建立在子句中使用的列中。SQL是否在where每次在句子中执行查询?
; O6 q6 r- ], }更新    -说明结果:/ C# m/ @' I9 j7 @  o6 c
区别在于())id查询的第二部分-
9 F% \% x: q$ z$ |, ^2   DEPENDENT SUBQUERY  submission_tags ref st_tag_id   st_tag_id  4    const   2966                                                                                                                                                                                                                                                      Using wherevs 1带连接的索引行:
' m) k1 Y- m3 R  g0 B                SIMPLE  s   eq_ref  PRIMARY PRIMARY 4   newsladder_production.st.submission_id  1   Using index               
; |; C2 G0 G) d5 T    解决方案:                                                                $ G4 z# u* e, [  A" H/ u. c" `
                                                                相关子查询(即,其中where条件取决于从包含查询的行中获得的值的子查询)将为每行执行一次。一个不相关的子查询(包括where包含查询的子查询将在开始时执行一次。SQL发动机会自动区分这一点。
; h) S% E3 K9 I5 B但是,是的,解释计划将为您提供肮脏的细节。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则