关于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
相关产品推荐
相关产品推荐

