MySQL 使用 LOAD INFILE 进行批量插入 - MyISAM 仅比 MEMORY 引擎慢

标签 mysql memory bulk load-data-infile

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

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

问题如下。我们选择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 速度进行比较,因为写入总是比读取慢。

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

希望这有帮助。

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

相关文章:

Mysql 创建带有计数子句的 View

mysql - 需要 mySQL 查询来检查另一个表中更新的生日

c - 发生故障时释放所有分配的内存

java - 应用程序终止后对象会发生什么

sql - 将文本文件的内容读取到 varchar 中而不使用 BULK

php - 如何在php和mysql中连接2个数据库?

时间:2019-03-08 标签:c++customoperatornew

php - 为什么不推荐使用 PHP 邮件功能发送批量电子邮件?

Linq 到 Nhibernate 批量更新查询等效?

mysql 连接两个索引需要很长时间!