为何带分组子查询的Join语句性能更优?
为什么带
group by的关联查询性能更优? 核心原因:group by acc.uuid减少了关联匹配的重复计算量
先明确你的表结构关键信息:
Users.id已索引,Accounts.uuid和user_id已索引,Trades.account_uuid未索引- 三张表无外键约束,存在
Accounts中同一user_id对应重复uuid的情况
前两个查询性能差的原因
无论是JOIN关联(查询1)还是IN子查询(查询2),执行逻辑本质类似:
- 先通过
Accounts.user_id=1(带索引,这步很快)获取该用户对应的所有uuid,如果存在重复的uuid,结果集里会包含多条重复记录 - 由于
Trades.account_uuid无索引,数据库只能对Trades做全表扫描,然后把每一行的account_uuid和Accounts返回的所有uuid(包括重复的)逐一匹配 - 重复的
uuid会导致同一行Trades被多次匹配、校验,额外增加了大量无意义的计算,最终拖慢查询速度
查询3性能提升的关键
查询3里的group by acc.uuid做了两个关键优化:
- 去重
Accounts的uuid:子查询先过滤出user_id=1的uuid,再通过group by去重,返回的是唯一的uuid集合,结果集大小远小于未去重的情况 - 减少关联匹配次数:当
Trades全表扫描时,每一行只需要和去重后的唯一uuid集合做一次匹配校验,避免了重复uuid导致的多次重复计算,直接减少了大量的比较操作,所以耗时大幅降低
为什么移除group by后性能回落?
移除group by后,子查询返回的是包含重复uuid的结果集,关联Trades的逻辑就和前两个查询完全一致,重复匹配的额外计算又回来了,所以性能和前两个查询持平
内容的提问来源于stack exchange,提问作者sardok
相关产品推荐
相关产品推荐

