mysql - 提高 mysql LOAD DATA/mysqlimport 的性能?

标签 mysql mariadb load-data-infile

我正在将 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_sizelog_file_sizewrite_io_threadsbulk_insert_buffer_size 。但当我进行比较测试时,好处并不是很明显(可能比 innodb_buffer_pool_size 足够大快 10-20%)。

关于mysql - 提高 mysql LOAD DATA/mysqlimport 的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58305653/

相关文章:

php - mysql 请求逻辑

mysqli数据库表与codeigniter中的求和值连接

node.js - Waterline/Sails.js 使用 MariaDB 进行批量插入和删除

MySql、LOAD DATA 或 BATCH INSERT 或任何其他更好的批量插入方式

php - 使用 PHP 在 mysql (blob) 中插入 NULL

mysql - 为什么 SQL 查询 SELECT 不返回 IS NULL 结果

MySQL 触发器使用不同的 TIMEZONE

mysql - 数据库、表、列排序规则的区别

php - 将多个文本文件导入到mysql数据库中的不同表中

c# - LOAD DATA INFILE 有时找不到文件?