2012-07-19 84 views
2

我们目前正在对MySQL进行几项性能测试,以将其与我们为数据库原型开发的方法进行比较。简而言之:数据库为空,给定一个巨大的csv文件,尽可能快地将数据加载到内存中。MySQL批量插入LOAD INFILE - MyISAM仅比MEMORY引擎慢

我们正在测试具有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(单线程,但写入内存不那么慢)是更快。 PS:改变read_buffer_size或任何其他增值税我发现谷歌搜索,没有导致显着的改善。

回答

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

我想你不能比较插件的速度,这是厕所-l写操作将读操作写与读取相比总是较慢。

在RAM中加载2.6GB数据将花费大量时间。它主要取决于您的操作系统的RAM和IO配置的写入速度。

希望这会有所帮助。

+0

没有导致可衡量的改进。 :( 甚至试图将bulk_insert_buffer_size设置为512MB。仍然没有改进。 – Bouncner 2012-07-19 11:12:11

+0

对不起,偶然跳过了阅读余下的帖子。: -/ CONCURRENT在我们的机器上稍微微微秒。它只是可测量的,但它是一个改进 我知道写入内存比写不慢。但是由于I/O输入的单字符读取,这些加载时间非常缓慢,因此RAM写入不应该真的变慢。 在我们的原型中,我们使用标准的std :: vectors来编写所有的数据,而且我们的数量级更快。所以写入RAM并不是这里的实际问题。 – Bouncner 2012-07-20 11:13:25

0

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

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