解析并向SQL插入1000万条记录

问题描述

| 因此,我在excel文件中有大约1000万条记录,这些记录必须以特定的方式解析(我不能只转换为CSV并像这样插入),然后插入到mysql数据库的不同表中。我已经把它从整夜整整变成只花几个小时。但是,我想进一步减少。任何人有任何技巧或提示可以帮助我吗?我正在使用Java和JDBC进行解析和连接。     

解决方法

        Mysql允许您从文件加载。也许您应该做的是:读取10000条记录并创建一个文件。开始读取接下来的10000条记录时,开始并行运行
load data infile
。 因此,这应该使您更接近快速解决方案: 并行读取和加载 代替单个插入,使用批量数据加载工具     ,        研究使用executeBatch并执行1000个左右的块。那会很有帮助。     ,        一个主意... 在mysql中创建一个名为excel_staging的表,该表与您的excel文件的结构相匹配,以建立一个临时数据库(临时),为此表使用myisam引擎。 使用加载文件中的数据将excel文件(保存为csv)加载到excel_staging表中-填充文件的时间不应超过几分钟,尤其是在填充myisam时。
truncate table excel_staging;

load data infile \'excel_staging.csv\'
into table excel_staging
fields terminated by...
lines terminated by..
(
field1,field2,...
);
将大量select写入outfile语句,这些语句将excel_staging表中的数据提取到单独的csv文件中,您将使用这些文件将其加载到单独的innodb生产数据库表中。必要时,您此时可以发挥真正的创造力-您甚至可能需要加载额外的数据以支持联接等,以便生成格式良好的csv输出。
select distinct cust_id,name into outfile \'customers.csv\' 
fields termniated by...
lines terminated by...
from
 excel_staging
order by
 cust_id; -- order for innodb import

select distinct dept_id,name into outfile \'departments.csv\' 
fields termniated by...
lines terminated by...
from
 excel_staging
order by
 dept_id;
使用加载数据infile将按主键csv文件格式化,清理和排序的格式正确的文件加载到生产innodb表中...
load data infile \'customers.csv\'
into table customers
fields terminated by...
lines terminated by..
(
cust_id,name
);

...
排除编写解决方案的时间(例如30分钟),应该能够加载到暂存中,输出到csv以及加载到生产表中,大约需要ermm ...端到端的6分钟。 希望这可以帮助。     ,        确保在执行插入操作时禁用外键检查(仅影响InnoDB),这会大大加快速度。然后,当然请在完成后重新启用外键。     ,        一些JDBC性能提示,请将连接对象的autoCommit设置为false。但是请确保在大量插入(每100K或更多)之后提交。另外,在普通的Statement对象上使用和重用PreparedStatement对象。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...