我正在尝试将 CSV 文件导入到表中,但速度非常慢。我有大约 1000 个文件,每个文件大小为 40 MB。每当我尝试导入它时,我都可以看到它以每秒大约 30 - 60 行的速度插入。处理我的所有文件需要很长时间。我该如何加快速度?我已经将 mysql.cnf 文件修改为以下配置,但不幸的是,这并没有加快速度:
/etc/mysql/conf.d/mysql.cnf
[mysqld]
innodb_buffer_pool_size=12G
innodb_io_capacity = 2000
innodb_read_io_threads = 48
innodb_thread_concurrency = 0
innodb_write_io_threads = 48
innodb_buffer_pool_size=12G
innodb_log_file_size = 512M
max_connections = 1000
max_allowed_packet = 128M
#key_buffer = 1000M
bulk_insert_buffer_size = 1024M
innodb_doublewrite = 0
innodb_flush_log_at_trx_commit = 2
key_buffer_size = 4000M
它确实说根据 PHPMyAdmin 在 InnoDB 中配置了 12G,所以我可以放心地确认该配置至少有效。
需要时的规格:
OS: Ubuntu 18.04
CPU: 6 cores, 12 threads @ 4.5 GHz
RAM: 32 GB DDR4 @ 3.2 GHz
SSD: 1 TB NVME @ 3.5 GB/s Read & 3.3 GB/s Write
答案1
你应该看看LOAD DATA
MySQL 函数,或者mysqlimport
工具。
insert
据报道,这两个函数比逐个执行的速度要快 20-30 倍,每秒至少可以达到 500-1000 行。
由于您没有提供有关数据格式的任何信息,因此很难提供详细的使用说明mysqlimport
,但这似乎是最适合您情况的工具。
答案2
事实证明,每个文件的文件编码都不同。有些文件采用 UTF-8 编码,有些采用 ISO 8859-1 (Latin1) 编码,这导致许多程序需要很长时间才能导入,因为(我认为)需要将其转换为另一种编码。现在,导入 40 MB 的文件只需大约 6 秒,而不是 48 分钟。感谢 @vidarlo 提出的 mysqlimport 建议,这当然是一个改进,但总体而言,时间改进对我来说已经足够了!