20多个表,每个都有userId 和其他几个属性,要根据userId把他们全部汇总,如何处理?

20多个表,每个表都有userId 和几个属性,要把他们全部都拼到一张表,怎么处理?

按 userId 汇总关联 20 张表。

面对 20多张表 的全量字段合并(宽表化),这是一个 ETL(抽取、转换、加载) 过程。

如果直接用 JOIN 拼 20 张表,上百万行数据在执行时会产生巨大的笛卡尔积风险,且极易触发 MySQL 的溢出或者超时。

方案一:SQL 离线宽表化(推荐)

采用 "主表 + 逐步左连接" 的方式,分步写入一张中间宽表。

1. 创建目标宽表(大宽表)

先创建一个包含所有字段的宽表。

注意:关联字段必须全部建有索引。

这 20 张表参与关联的 user_id 必须全部建有索引。

sql 复制代码
CREATE TABLE tmp_user_profile_20260414 AS 
SELECT user_id FROM tmp_data_20260414;

ALTER TABLE tmp_user_profile_20260414 ADD PRIMARY KEY (user_id);
2. 分步更新(分而治之)

每张表单独更新到宽表中,这样即使某张表数据有问题,也不会影响整体流程。

使用 sql 的 Update Join 处理。

sql 复制代码
-- 拼入数据
UPDATE tmp_user_profile_20260414 w
JOIN (SELECT user_id, AVG(diff) as avg_sleep FROM t_sleep GROUP BY user_id) s 
  ON w.user_id = s.user_id
SET w.avg_sleep_seconds = s.avg_sleep;

-- 重复上述步骤,直到 20 张表全部拼完

方案二:Java 内存并行映射(高性能,适合逻辑复杂)

如果某些表的属性需要复杂的 Java 逻辑计算,建议在后端处理:

  1. 定义 Map 容器:Map<Long, UserProfileDTO> profileMap
  2. 并行查询:使用 CompletableFuture 并行开启 20 个任务,每个任务查一张表并按 user_id 塞入 Map。
  3. 批量写入:拼装完成后,利用 MyBatis 的 batchInsert 一次性落库。
相关推荐
彧azz7 小时前
Java学习语法篇:变量
java·学习
程序员阿鹏7 小时前
为什么MySQL InnoDB选择B+树?
数据结构·数据库·b树·sql·mysql·算法·缓存
信誓旦旦的程序猿8 小时前
【量化系统从零构建 #04】存储设计:选型·建库·交易日历
java·人工智能·python·股票数据api·股票数据·股票数据api接口·股票api数据接口
yurenpai(27届找实习中)8 小时前
Java 10 的 var 为什么不能随便用?从订单汇总看懂类型推断与泛型陷阱
java·开发语言·java18
Flynt9 小时前
把公司项目迁到 Spring Boot 4.0:编译通过只是开始
java·spring boot·后端
Tangyuewei9 小时前
给老 Spring 项目装个 AI Agent
java·人工智能·spring
她的男孩10 小时前
多租户和数据权限怎么共存?扒完拦截器注册链路,我找到 4 个隐蔽的坑
java·后端·架构
小溪学编程10 小时前
Java BufferedReader 详解:从基础用法到性能优化
java·python·性能优化
这个DBA有点耶10 小时前
非关系型数据库到底有几种?键值、文档、列族、图,一篇讲透
mysql·架构·nosql
HZero.chen10 小时前
Java 匿名类简介
java·匿名类