提高mysql加载数据infile的性能

Mic*_*ael 10 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"
Run Code Online (Sandbox Code Playgroud)

这适用于前几十万个记录,但随后每个后续加载的插入时间似乎都在增长(从我杀死它之前每个负载大约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
Run Code Online (Sandbox Code Playgroud)

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

还有什么可以加速这个,因为这似乎只是加载12m记录的过多时间?

cde*_*zaq 7

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

否则,每条记录导致指数重新计算,如果你有一大堆的指标,这样可以真正慢下来.


Ass*_*mon 2

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