我正在尝试使用LOAD DATA INFILE(来自CSV)将大约12m条记录批量加载到(本地)mysql中的InnoDB表中,并发现这需要很长时间才能完成。
主 key 类型为UUID,并且 key 在数据文件中未排序。
我已将数据文件拆分为包含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美分:
作为uuid的 key 是随机分布的,这使得维护索引变得困难。原因是 key 是按范围存储在文件系统块中的,因此让随机的uuid互相跟随会使OS在不利用高速缓存的情况下对文件系统进行读写块。我不知道是否可以更改键,但是您可以对输入文件中的uuid进行排序,看看是否有帮助。
仅供引用,为了更好地理解这个问题,我将看一看blog post,也许还会读这本书mysql high performance,其中有一章很好地介绍了innodb聚集索引。
祝你好运!
关于mysql - 提高mysql加载数据infile的性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8790462/