2

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

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

问题如下。我们选择了 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 或我在谷歌上发现的任何其他变量,并没有带来显着的改进。

4

2 回答 2

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 配置的写入速度。

希望这可以帮助。

于 2012-07-19T10:13:48.937 回答
0

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

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

于 2012-12-11T15:15:32.310 回答