带有 LOAD INFILE 的 MySQL 批量插入 - MyISAM 仅比 MEMORY 引擎慢

原文 标签 mysql memory bulk load-data-infile

我们目前正在对 MySQL 进行多项性能测试,以将其与我们正在为数据库原型(prototype)开发的方法进行比较。简而言之:数据库是空的,给定一个巨大的 csv 文件,尽可能快地将数据加载到内存中。

我们正在一个 12 核 Westmere 服务器上进行测试,该服务器具有 48 GB RAM,因此内存消耗现在不是一个真正的问题。

问题如下。我们选择了 MySQL(广泛传播,开源)进行比较。由于我们的原型(prototype)是内存数据库,因此我们选择了 MySQL 中的内存引擎。

我们以这种方式插入(文件最大为 26 GB):

drop table if exists a.a;
SET @@max_heap_table_size=40000000000;
create table a.a(col_1 int, col_2 int, col_3 int) ENGINE=MEMORY;
LOAD DATA CONCURRENT INFILE "/tmp/input_files/input.csv" INTO TABLE a.a FIELDS TERMINATED BY ";";

对 2.6 GB 文件执行此加载大约需要 80 秒,比 ( wc -l ) 慢四倍。使用 MyISAM 仅慢 4 秒,即使正在写入磁盘。

我在这里做错了什么?我想使用内存引擎的数据写入必须比使用 MyISAM 快得多。我不明白为什么wc -l (都是单线程的,但写入内存并没有那么慢)要快得多。

PS:更改 read_buffer_size 或我在谷歌上发现的任何其他变量,并没有带来显着的改进。

最佳答案

尝试设置以下变量

max_heap_table_size=40GB;
bulk_insert_buffer_size=32MB
read_buffer_size=1M
read_rnd_buffer_size=1M

它可能会稍微减少查询执行时间。

还有CONCURRENT仅适用于 MyISAM 表,它会根据手动引用减慢插入速度:Load Data Infile

我认为您无法将作为写入操作的插入速度与作为读取操作的 wc -l 进行比较,因为与读取相比,写入总是较慢。

在 RAM 中加载 2.6GB 数据需要相当长的时间。它主要取决于您的操作系统的 RAM 和 IO 配置的写入速度。

希望这可以帮助。

关于带有 LOAD INFILE 的 MySQL 批量插入 - MyISAM 仅比 MEMORY 引擎慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11558343/

相关文章:

asp.net - 在ASP.NET页中执行批量处理

mysql - 给出 2009 年 5 月、6 月和 2009 年 7 月月份预订房间的 list ,价格超过 8000 元/天

c - 在C中-在不同的上下文中释放内存

linux - 如何在Linux上使用“pmap”查找我编写的程序的内存使用情况

perl - 有没有一种简单的方法来进行批量文件文本替换?

node.js - 使用 nodeJs 发送原始电子邮件文件

mysql - 如何计算mysql中的行数

php - 设置相对于DOCUMENT_ROOT的mysql日志记录路径

sql - 优化查询

c - 多次使用realloc()