現在、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 秒かかります。これは、( ) よりも 4 倍遅くなりますwc -l
。MyISAM を使用すると、ディスクに書き込んでいるにもかかわらず、わずか 4 秒しか遅くなりません。
ここで何が間違っていますか?メモリ エンジンを使用したデータ書き込みは、MyISAM を使用するよりもはるかに高速に違いないと思います。wc -l
そして、なぜ(両方ともシングルスレッドですが、メモリへの書き込みはそれほど遅くありません)がそれほど高速なのかわかりません。
PS: read_buffer_size またはグーグルで見つけた他の変数を変更しても、大幅な改善にはなりませんでした。