我正在将 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 服务器正确加载。例如,显示“innodb_doublewrite”等变量
显示OFF
无论如何,如何进一步提高导入速度?或者我的数据库是瓶颈,无法克服 15-20 MB/s 的阈值?
更新: 有趣的是,如果我将 csv 从硬盘导入到 ramdisk,性能几乎相同(只是好一点,但永远不会超过 25 MB/s)。我还测试了相同数量的行,但仅测试了几 (5) 列。我的速度达到了大约 80 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 。它看起来很有希望,但可能还没有收到太多反馈。我不确定这对您的情况有帮助。
我在互联网上看到了各种 list ,建议在以下配置参数中使用更高的值:log_buffer_size
、log_file_size
、write_io_threads
、bulk_insert_buffer_size
。但当我进行比较测试时,好处并不是很明显(可能比 innodb_buffer_pool_size
足够大快 10-20%)。
关于mysql - 提高 mysql LOAD DATA/mysqlimport 的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58305653/