2

現在、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 またはグーグルで見つけた他の変数を変更しても、大幅な改善にはなりませんでした。

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 と比較することはできないと思います。

2.6GB のデータを RAM にロードするには、かなりの時間がかかります。これは主に、RAM の書き込み速度と OS の IO 構成に依存します。

お役に立てれば。

于 2012-07-19T10:13:48.937 に答える
0

MEMORY エンジンと MyISAM エンジンの間に大きな違いが見られなかった理由は、ディスク キャッシングによるものだと思います。48 GB の RAM があり、2.6 GB のデータしかロードしていません。

MyISAM エンジンは「ファイル」に書き込みを行っていますが、OS はそのファイル キャッシュ機能を使用して、これらのファイルの書き込みを実際に RAM で実行しています。次に、ディスクへの実際の書き込みを「遅延」します。「wc」について言及したので、Linuxを使用していると仮定します。その仕組みを理解するための出発点として、dirty_ratio および dirty_background_ratio カーネル設定を読んでください。

于 2012-12-11T15:15:32.310 に答える