MySQL批量插入LOAD INFOILE-MISAM只比MEMORY引擎慢



我们目前正在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或我在谷歌上发现的任何其他变量,都没有带来显著的改进。

尝试设置以下变量以及

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

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

此外,CONCURRENT仅适用于MyISAM表,它根据手册减慢了插入速度。请参阅:加载数据Infile

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

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

希望这能有所帮助。

我认为MEMORY引擎和MyISAM引擎之间没有显著差异的原因是磁盘缓存。您有48GB的RAM,并且只加载2.6GB的数据。

MyISAM引擎正在写入"文件",但操作系统正在使用其文件缓存功能,使这些文件写入实际发生在RAM中。然后,它将"懒散地"向磁盘进行实际写入。既然您提到了"wc",那么我假设您使用的是Linux。阅读dirty_ratio和dirty_background_ratio内核设置,以此作为理解其工作原理的起点。

最新更新