|
最近系统切换,迁移了 MySQL 中一些数据量超过千万的大表,分享一下经验。
先下个简单的定义:旧系统的的表,我们姑且称为旧表。新系统与之对应的表,称为新表。
背景:
- 旧表数据量 1000 多万,并且类似的表有十几个。
- 新表字段比旧表多,需要多个旧表关联才能完成映射。
- 新表中有个字段 rid,需要保证全局唯一。
最初方案是使用 MySQL 的序列生成 rid,然后用 insert into ... select 语法去映射、插入数据。但是,由于数据量太大,SQL 根本没法在可接受的时间内完成执行。经过生产真实数据的测试,这种方案,数据量在 80 万左右,一上午都没跑完,所以果断放弃。经过一系列探索,找到了一个能用的方案,能在可接受的时间内完成迁移、映射。
方案:
- 将大表拆分,尽量单表数据量小于 500 万。如果拆分后,SQL 执行的依旧很慢,那就继续拆分成更小的表。
- 先映射存有主要数据的表。映射时注意保留旧表中的关联字段。新表中需要的其他旧表中的字段,通过关联字段去更新。更新时,各个表中关联字段要增加索引,这个优化涉及到 MySQL的 NLJ 算法,有兴趣可以去搜相关资料。
- 利用数据库自增主键去生成 rid。新表的主键是 varchar 类型,暂时先改成 int,并设置为自增主键。在生成完数据后,按照 rid 的生成规则去更新 rid 字段。
这样一番操作下来,500 万的表在半个小时之内就可以完成映射。
虽然确实用这种方式完成了迁移,但感觉还是不够快,你还有其他更快、更好的方案吗? |
|