快速迁移表数据(几万到上百万不等)的4种方案
4种方案如下:
方案一、 使用
mysqldump
命令 导出 A 表数据为 xx.sql 文件,再通过mysql -e source xx.sql
导入
优点:
mysqldump
是 MySQL 自带工具,使用方便。mysqldump
支持使用--where
过滤数据- 对于小规模数据(如几千条),操作简单且快速。
- 可以导出表结构、索引、约束和数据。
缺点:
- 不支持导出部分字段
- 对于大数据量(50万到100万),导出和导入速度较慢。
- SQL 文件通常比原始数据占用更多磁盘空间。
- 导出和导入过程中,A 表的数据可能会发生变化。
适用场景:
- 数据量较小(几千到几万条)。
- 需要迁移表结构和数据。
- 跨版本或跨服务器迁移。
方案二、导出 A 表数据为 CSV 文件,再使用
LOAD DATA INFILE
或者LOAD DATA LOCAL INFILE
导入 CSV 文件
优点:
- 性能极高:LOAD DATA INFILE 是 MySQL 中最快的批量数据导入方式。
- 节省磁盘空间:CSV 文件比 SQL 文件更紧凑。
- 灵活性强:导出CSV文件时可筛选表字段,可自定义字段分隔符、行分隔符等。
- 适合大数据量:对于 50万到100万条数据,性能优势明显。
缺点:
需要文件权限:
LOAD DATA INFILE
需要文件存储在数据库服务器上,且 MySQL 用户需要有文件读取权限。LOAD DATA LOCAL INFILE
需要文件存储在数据库客户端上不支持表结构:只能迁移数据,表结构和索引需要单独处理。
数据格式要求严格:CSV 文件必须与目标表字段严格匹配,否则可能导致导入失败。
不适合跨服务器迁移:如果 A 表和 B 表不在同一服务器,需要额外步骤传输文件。
适用场景:
- 大数据量(几十万到数百万条)。
- A 表和 B 表在同一服务器,或可以轻松传输文件。
- 只需要迁移数据,表结构已提前创建。
- 两表结构不一致,只是部分数据一致。
方案三、
INSERT INTO ... SELECT
从 A 表读取数据插入到 B 表
优点:
- 一条 SQL 语句即可完成数据迁移。
- 完全在 MySQL 内部完成,不需要导出文件或使用外部工具。
- 可以在事务中执行,确保数据一致性。
- 可以在
SELECT
语句中对数据进行转换或过滤。
缺点:
- 性能较差:对于大数据量,插入速度较慢,尤其是目标表有索引或约束时。
- 锁表风险:如果 A 表和 B 表都较大,可能会锁表,影响其他操作。
- 不适合跨服务器迁移:A 表和 B 表必须在同一 MySQL 实例中。
适用场景:
- 数据量中等(几万到几十万条)。
- A 表和 B 表在同一 MySQL 实例。
- 需要对数据进行简单转换或过滤。
方案四、使用物理拷贝文件的方式,使用mysql5.6引入的 可传输表空间功能 把 A 表的数据给到 B 表
优点:
- 性能极高:直接复制表空间文件,速度非常快。
- 适合大数据量:对于 50万到100万条数据,性能优势明显。
- 减少锁表时间:操作过程中锁表时间较短。
缺点:
- 复杂性高:需要手动操作表空间文件,步骤较多,容易出错。
- 限制较多:
- A 表和 B 表必须使用 InnoDB 引擎。
- A 表和 B 表的表结构必须完全一致。
- 需要 MySQL 服务器有文件系统访问权限。
- 不适合跨服务器迁移:如果 A 表和 B 表不在同一服务器,操作更复杂。
适用场景:
- 大数据量(几十万到数百万条)。
- A 表和 B 表在同一服务器,且表结构完全一致。
- 对性能要求极高,且操作人员熟悉表空间管理。
综合对比
方案 | 性能 | 复杂性 | 适用数据量 | 是否需要额外工具 | 是否支持跨服务器 | 是否支持数据转换 |
---|---|---|---|---|---|---|
mysqldump + source |
低 | 低 | 小规模 | 否 | 是 | 否 |
INSERT INTO ... SELECT |
中 | 低 | 中等规模 | 否 | 否 | 是 |
导出 CSV + LOAD DATA INFILE |
高 | 中 | 大规模 | 是 | 是(需传输文件) | 否 |
可传输表空间 | 极高 | 高 | 大规模 | 是 | 否 | 否 |
推荐方案
- 如果 A 表和 B 表在同一服务器,且数据量较大(50万到100万):
- 优先选择 导出 CSV +
LOAD DATA INFILE
,性能最佳。 - 如果表结构完全一致,且对性能要求极高,可以选择 可传输表空间。
- 优先选择 导出 CSV +
- 如果 A 表和 B 表在同一服务器,且数据量中等(几万到几十万):
- 使用
INSERT INTO ... SELECT
,操作简单且灵活。
- 使用
- 如果 A 表和 B 表在不同服务器,或需要跨版本迁移:
- 使用
mysqldump
+source
,兼容性最好。
- 使用
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: