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

时间:2012-07-19 09:59:33

标签: mysql memory bulk load-data-infile

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

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

问题如下。我们没有选择MySQL(广泛传播,开源)进行比较。由于我们的原型是一个内存数据库,我们选择了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(单线程,但写入mem并不那么慢)的速度要快得多。

PS:更改read_buffer_size或我发现谷歌搜索的任何其他变种,没有带来显着改善。

2 个答案:

答案 0 :(得分:2)

尝试设置以下变量

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配置。

希望这会有所帮助。

答案 1 :(得分:0)

我认为你没有看到MEMORY引擎和MyISAM引擎之间存在显着差异的原因是由于磁盘缓存。你有48GB的RAM,只加载2.6GB的数据。

MyISAM引擎正在写入'文件',但操作系统正在使用其文件缓存功能使这些文件写入实际发生在RAM中。然后它会'懒洋洋地'实际写入磁盘。既然你提到'wc',我会假设你使用的是Linux。阅读dirty_ratio和dirty_background_ratio内核设置作为理解其工作原理的起点。