解析并在SQL中插入1000万条记录

时间:2011-06-23 17:53:02

标签: java mysql optimization jdbc

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

5 个答案:

答案 0 :(得分:5)

Mysql允许你load from a file。也许你应该做的是:读取10000条记录并创建一个文件。在开始阅读下一条10000条记录时,开始并行运行load data infile

所以这应该让你更接近快速解决方案:

  1. 并行化读取和加载
  2. 使用批量数据加载工具
  3. ,而不是单独的插入

答案 1 :(得分:3)

查看使用executeBatch并执行1000左右的块。这将有很大帮助。

答案 2 :(得分:2)

一个想法......

在mysql中创建一个临时(临时)数据库,其中一个名为excel_staging的表与excel文件的结构相匹配 - 对此表使用myisam引擎。

使用load data infile将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 into输出到outfile语句中,这些语句将excel_staging表中的数据提取到您将用于加载到各个 innodb 生产数据库表中的各个csv文件中。如果有必要,您可以在这一点上非常有创意 - 您甚至可能需要加载额外的数据来支持连接等,这样您就可以生成格式良好的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并加载到生产表中大约2分钟...端口到端口。

希望这有帮助。

答案 3 :(得分:1)

确保在插入时禁用外键检查(仅影响InnoDB),速度非常快。当然,当你完成后重新启用外键。

答案 4 :(得分:1)

一些JDBC性能提示,将连接对象的autoCommit设置为false。但请确保在大量插入(每100K或更多)之后提交。另外,在普通的Statement对象上使用和重用PreparedStatement对象。