我正在将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
语句只能使用一个CPU内核。您可能会在加载过程中监视CPU利用率,以查看一个内核已被充分利用,并且它只能提供那么多的输出数据-因此使磁盘吞吐量利用率不足。
MySQL的最新版本具有新的并行加载功能:https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-utilities-parallel-table.html。看起来很有希望,但可能尚未收到太多反馈。我不确定这是否对您有帮助。
我在互联网上看到各种清单,建议在以下配置参数中使用更高的值:log_buffer_size
,log_file_size
,write_io_threads
,bulk_insert_buffer_size
。但是当我执行比较测试时,好处并不十分明显(也许比innodb_buffer_pool_size
足够大要快10-20%)。