我们目前正在对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或我发现谷歌搜索的任何其他变种,没有带来显着改善。
答案 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内核设置作为理解其工作原理的起点。