我们目前正在对 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/