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

关于5000万行表自连接执行时间及连接条件的技术问询

问题解答

1. 基准测试0.016秒耗时的合理性分析

你计算时误用了全表自连接的理论行数(2.5e15),但实际查询是带where uf1.user_1 = ?的单用户查询,而非全表遍历:

  • 首先,t_user_friend表的5000万行是整个平台的好友关系总量,但单个用户的好友数通常远小于这个量级(比如普通用户可能只有几百个好友)。
  • 其次,数据库的索引优化大幅降低了计算量:
    • user_1和user_2字段都建了索引,查询时会先通过where uf1.user_1 = ?快速定位该用户的所有好友(即uf1.user_2集合);
    • 接着用这些好友ID作为uf2.user_1的查询条件,通过索引快速获取每个好友的好友列表;
    • 最后count(distinct)操作会在遍历过程中实时去重,不需要生成所有结果行再统计,进一步减少了资源消耗。
      因此,针对单用户的“好友的好友”计数查询,在配置合理的笔记本上耗时0.016秒是完全合理的。

2. 自连接条件的正确性判断

原查询的连接条件on uf1.user_1 = uf2.user_2确实存在逻辑错误:

  • 正确的“好友的好友”逻辑是:用户A的好友是B(对应uf1中user_1=A, user_2=B),B的好友是C(对应uf2中user_1=B, user_2=C)。
  • 因此连接条件应该是uf1.user_2 = uf2.user_1,这样才能将A的好友B与B的好友C关联起来。
  • 原条件uf1.user_1 = uf2.user_2实际查询的是“把A加为好友的用户”(即A的关注者),而非A的好友的好友。

原查询的正确写法应为:

select count(distinct uf2.user_2) from t_user_friend uf1
inner join t_user_friend uf2 on uf1.user_2 = uf2.user_1
where uf1.user_1 = ?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 08:25:20