提高mysql LOAD DATA / mysqlimport的性能?

问题描述 投票:0回答:1

我正在将CSV 15GB(30mio行)批处理到mysql-8数据库中。

问题:任务大约需要20分钟,吞吐量大约为15-20 MB / s。尽管硬盘驱动器能够以150 MB / s的速度传输文件。

我有一个20GB的RAM磁盘,可容纳我的csv。导入如下:

mysqlimport --user="root" --password="pass" --local --use-threads=8 mytable /tmp/mydata.csv

这将在引擎盖下使用LOAD DATA。我的目标表没有任何索引,但是大约有100行(我不能更改它)。

奇怪的是,我尝试在/etc/mysql/my.cnf中按如下方式调整几个配置参数,但是它们并没有带来任何明显的改善:

log_bin=0
skip-log-bin
innodb_buffer_pool_size=12G
innodb_log_buffer_size=4M
innodb_flush_log_at_trx_commit=2
innodb_doublewrite=0
innodb_autoinc_lock_mode=2

问题:LOAD DATA / mysqlimport是否尊重那些配置更改?还是绕过?还是我完全使用了正确的配置文件?

至少对变量进行选择显示它们已被mysql服务器正确加载。例如,show variables like 'innodb_doublewrite'显示OFF

无论如何,如何进一步提高导入速度?还是我的数据库成为瓶颈,并且没有办法克服15-20 MB / s的阈值?

mysql mariadb load-data-infile
1个回答
0
投票

MySQL / MariaDB引擎在进行批量插入时几乎没有并行化。每个LOAD DATA语句只能使用一个CPU内核。您可能会在加载过程中监视CPU利用率,以查看一个内核已被充分利用,并且它只能提供那么多的输出数据-因此使磁盘吞吐量利用率不足。

MySQL的最新版本具有新的并行加载功能:https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-utilities-parallel-table.html。看起来很有希望,但可能尚未收到太多反馈。我不确定这是否对您有帮助。

我在互联网上看到各种清单,建议在以下配置参数中使用更高的值:log_buffer_sizelog_file_sizewrite_io_threadsbulk_insert_buffer_size。但是当我执行比较测试时,好处并不十分明显(也许比innodb_buffer_pool_size足够大要快10-20%)。

© www.soinside.com 2019 - 2024. All rights reserved.