表数据批量快速导入方案
1. 客户端导入
- 连接池
客户端一般使用jdbc、odbc等驱动连接数据库,采用数据库连接池;
- 批量导入
为了快速导入数据,我们采用批量导入, 每批次导入1000条数据
- 多线程
同时开启多线程任务,可以采用线程池,根据数据库的承受能力,确定最大线程数
注意数据库连接处的大小要大于等于多线程任务线程池的大小,而且建议每个线程内部通过连接池获取连接资源
多线程操作注意操作的实体数量,尽量不要产生更多的实体,防止占用过多资源(例如字符串拼接会导致数据量倍增),导致oom
- 索引和解释计划更新
如果导入数据的表是新建表,建议先导入数据,再设置主键或索引
某些数据库在大量数据导入后,索引更新可能有滞后,可以手动重建索引
- 测试样例
下面给出一组测试的样例,提供参考,该配置写入速度约为: 1000000条/分钟
项目 | 选项 | 说明 |
---|---|---|
数据库 | mysql | |
连接池 | druid | |
连接池大小 | 10 | |
线程池最大线程数 | 10 | |
单次批量写入数据量 | 1000 | |
表字段数量 | 20 | |
是否有索引 | 是 |
- 步骤
step 1: 创建表
step 2: 开启多线程任务批量写入数据
step 3: 写入完成,建立索引
2 服务端导入
2.1 mysql
- load
msyql服务端可以使用load命令导入,先把文件上传到mysql服务器,再执行load命令
LOAD DATA INFILE '路径/上传文件' INTO TABLE 表名
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
- mysql
mysqlimport命令导入,先把文件上传到mysql服务器,再执行mysqlimport命令
mysqlimport -uroot -p 123456 --fields-terminated-by="," --columns=id,name /home/table_abc.txt
2.2 oracle
- impdb
使用impdb导入,先把文件上传到oracle服务器,执行如下示例命令
impdp test/123456@192.168.0.123:1521/ORCLDB DIRECTORY=DATA_PUMP_DIR DUMPFILE=.DMP SCHEMAS=admin logfile=test.log