每日CSV同步场景下全量更新MySQL表数据的最优方案
全量CSV同步MySQL方案选择建议
两种方案没有绝对的优劣,核心看你的数据规模和业务约束,以下是实际生产中的选型标准:
方案1:清空表后全量插入
适用场景
- CSV单文件行数在10万行以内,全量插入耗时能控制在Lambda 15分钟的运行上限内
- 目标表无关联外键、无额外业务自定义字段,清空操作不会触发级联修改影响其他业务
- 可接受短时间表数据不可用,或愿意用双表切换规避 downtime
最优实践
不要直接清空正式表插入,优化为临时表预写入后切换:
- 新建和正式表结构完全一致的临时表
- 把CSV数据批量写入临时表,校验行数、字段合法性
- 执行
RENAME TABLE 正式表 TO 归档表, 临时表 TO 正式表,全程锁表时间在毫秒级 - 确认同步正常后删除归档表即可
优势
逻辑极简,没有比对、Upsert之类的复杂逻辑,几乎不会出现同步bug,运维成本极低。
方案2:比对后执行Upsert+删除冗余行
适用场景
- CSV数据量超过100万行,全量插入会占用过多数据库IO影响线上业务,或耗时超出Lambda运行限制
- 目标表存在其他业务新增的字段,不能直接清空整表
- 要求同步过程中表数据始终完整可用,不能出现数据空缺窗口
最优实践
绝对不要逐行查询数据库比对,效率会低几个数量级,按以下流程优化:
- 把CSV所有行的唯一键、需要更新的字段批量导入到MySQL临时表
- 用
INSERT INTO 正式表 (字段1,字段2...) SELECT 字段1,字段2... FROM 临时表 ON DUPLICATE KEY UPDATE 字段1=VALUES(字段1), 字段2=VALUES(字段2)批量完成新增/更新 - 执行单条删除语句:
DELETE FROM 正式表 WHERE 唯一键 NOT IN (SELECT 唯一键 FROM 临时表)清理CSV中已删除的行
优势
不需要重写全表数据,IO开销小,适合大数据量场景。
优先选型建议
绝大多数日常更新的全量CSV同步场景,优先选临时表+双表切换的清空重插方案,性价比最高:不需要处理复杂的比对逻辑,不会出现漏更、错更的问题,100万行以内的CSV处理时间通常不会超过1分钟,完全符合Lambda的运行约束。
通用避坑点
- 任何方案同步前都要先校验CSV完整性,避免损坏的半截文件冲毁正式表数据
- 同步操作必须包裹在事务中,出现异常直接回滚,避免半同步的脏数据
- 不要用逐行查询、逐行插入的逻辑,单条SQL批量操作的效率是逐行操作的百倍以上
内容的提问来源于stack exchange,提问作者Cami
相关产品推荐
相关产品推荐

