提高mysql加载数据infile的性能

时间:2012-01-09 15:05:40

标签: mysql sql innodb bulk-load

我正在尝试使用LOAD DATA INFILE(来自CSV)将大约12m条记录批量加载到(本地)mysql中的InnoDB表中,并发现它需要很长时间才能完成。

主键类型为UUID,数据文件中的键未排序。

我已将数据文件拆分为包含100000条记录的文件,并将其导入为:

mysql -e 'ALTER TABLE customer DISABLE KEYS;'
for file in *.csv
    mysql -e "SET sql_log_bin=0;SET FOREIGN_KEY_CHECKS=0; SET UNIQUE_CHECKS=0;
    SET AUTOCOMMIT=0;LOAD DATA INFILE '${file}' INTO TABLE table 
    FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';  COMMIT"

这适用于前几十万条记录,但随后每次后续加载的插入时间似乎都在增长(在我杀死它之前,每次加载大约7秒到大约2分钟。)

我正在使用8GB RAM的机器上运行,并将InnoDB参数设置为:

innodb_buffer_pool_size =1024M
innodb_additional_mem_pool_size =512M
innodb_log_file_size = 256M
innodb_log_buffer_size = 256M

我还尝试加载一个包含所有行但没有运气的CSV - 这在我杀了之前跑了超过2个小时。

还有什么能够加快速度,因为这似乎只是加载12m记录的时间过长了吗?

2 个答案:

答案 0 :(得分:7)

如果您知道数据是“干净的”,那么您可以在导入之前删除受影响的表上的索引,然后在完成后重新添加它们。

否则,每条记录都会导致index-recalc,如果你有一堆索引,这可能会真的减慢速度。

答案 1 :(得分:2)

总是很难说出性能问题的原因是什么,但这些是我的2美分: 你的密钥是一个uuid是随机分布的,这使得很难维护一个索引。原因是密钥是按文件系统块中的范围存储的,因此让随机uuids相互跟随使得OS在不利用缓存的情况下对文件系统进行读写块。我不知道你是否可以更改密钥,但你可以在输入文件中对uuids进行排序,看看是否有帮助。 仅供参考,为了更好地理解这个问题,我会看看这个blog post,也许可以阅读本书mysql high performance它有一个关于innodb聚集索引的很好的章节。 祝你好运!