IE盒子

搜索
查看: 92|回复: 1

MySQL 如何进行数据量超过千万的大表迁移

[复制链接]

1

主题

3

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2023-2-10 16:03:53 | 显示全部楼层 |阅读模式
最近系统切换,迁移了 MySQL 中一些数据量超过千万的大表,分享一下经验。
先下个简单的定义:旧系统的的表,我们姑且称为旧表。新系统与之对应的表,称为新表。
背景:

  • 旧表数据量 1000 多万,并且类似的表有十几个。
  • 新表字段比旧表多,需要多个旧表关联才能完成映射。
  • 新表中有个字段 rid,需要保证全局唯一。
最初方案是使用 MySQL 的序列生成 rid,然后用 insert into ... select 语法去映射、插入数据。但是,由于数据量太大,SQL 根本没法在可接受的时间内完成执行。经过生产真实数据的测试,这种方案,数据量在 80 万左右,一上午都没跑完,所以果断放弃。经过一系列探索,找到了一个能用的方案,能在可接受的时间内完成迁移、映射。
方案:

  • 将大表拆分,尽量单表数据量小于 500 万。如果拆分后,SQL 执行的依旧很慢,那就继续拆分成更小的表。
  • 先映射存有主要数据的表。映射时注意保留旧表中的关联字段。新表中需要的其他旧表中的字段,通过关联字段去更新。更新时,各个表中关联字段要增加索引,这个优化涉及到 MySQL的 NLJ 算法,有兴趣可以去搜相关资料。
  • 利用数据库自增主键去生成 rid。新表的主键是 varchar 类型,暂时先改成 int,并设置为自增主键。在生成完数据后,按照 rid 的生成规则去更新 rid 字段。
这样一番操作下来,500 万的表在半个小时之内就可以完成映射。
虽然确实用这种方式完成了迁移,但感觉还是不够快,你还有其他更快、更好的方案吗?
回复

使用道具 举报

2

主题

7

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 6 天前 | 显示全部楼层
打酱油的人拉,回复下赚取积分
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表