我正在批处理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=OFF
skip-log-bin
innodb_buffer_pool_size=20G
tmp_table_size=20G
max_heap_table_size=20G
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'
shows OFF
无论如何,如何进一步提高导入速度?或者我的数据库是瓶颈并且没有办法克服 15-20 MB/s 的阈值?
更新:
有趣的是,如果我将 csv 从硬盘导入到 ramdisk,性能几乎相同(只是好一点,但永远不会超过 25 MB/s)。我还测试了相同数量的行,但仅测试了几 (5) 列。我的速度达到了大约 80 MB/s。那么显然列数是瓶颈?但为什么更多的色谱柱会减慢这个过程呢?