微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决解析并向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对象。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。