You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何带分组子查询的Join语句性能更优?

为什么带group by的关联查询性能更优?

核心原因:group by acc.uuid减少了关联匹配的重复计算量

先明确你的表结构关键信息:

  • Users.id已索引,Accounts.uuid和user_id已索引,Trades.account_uuid未索引
  • 三张表无外键约束,存在Accounts中同一user_id对应重复uuid的情况

前两个查询性能差的原因

无论是JOIN关联(查询1)还是IN子查询(查询2),执行逻辑本质类似:

  1. 先通过Accounts.user_id=1(带索引,这步很快)获取该用户对应的所有uuid,如果存在重复的uuid,结果集里会包含多条重复记录
  2. 由于Trades.account_uuid无索引,数据库只能对Trades做全表扫描,然后把每一行的account_uuid和Accounts返回的所有uuid(包括重复的)逐一匹配
  3. 重复的uuid会导致同一行Trades被多次匹配、校验,额外增加了大量无意义的计算,最终拖慢查询速度

查询3性能提升的关键

查询3里的group by acc.uuid做了两个关键优化:

  1. 去重Accounts的uuid:子查询先过滤出user_id=1的uuid,再通过group by去重,返回的是唯一的uuid集合,结果集大小远小于未去重的情况
  2. 减少关联匹配次数:当Trades全表扫描时,每一行只需要和去重后的唯一uuid集合做一次匹配校验,避免了重复uuid导致的多次重复计算,直接减少了大量的比较操作,所以耗时大幅降低

为什么移除group by后性能回落?

移除group by后,子查询返回的是包含重复uuid的结果集,关联Trades的逻辑就和前两个查询完全一致,重复匹配的额外计算又回来了,所以性能和前两个查询持平


内容的提问来源于stack exchange,提问作者sardok

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 21:50:16