2

csvファイルにいくつかのデータがあります。データの量は膨大です(約65GB)。それらをすべてデータベースに挿入して、後で照会できるようにします。

csvファイル自体は非常に単純で、5列しかありません。したがって、基本的にすべてのデータが1つのテーブルに挿入されます。

今、私はこれらのデータをmysqlデータベースに挿入しようとしましたが、それにかかる時間は非常に長いです。私はこれらのデータのわずか1.3GBを挿入するためにほぼ6時間を費やしました(私のプロセッサはコアi5 2.9 GHz、RAMは4GB DDR3です)。

すべてのデータ挿入が4/5日以内に行われるように、この読み込みは非常に迅速に完了する必要があります。

この場合、データに対して妥当なクエリ速度が許容できる場合、どのデータベースが最高のパフォーマンスを示しますか?

また、私が従うべき他のいくつかのステップ/プラクティスはありますか?

4

1 に答える 1

1

おそらくそれをインポートする必要さえありません。engine=CSVでテーブルを作成できます。

mysql> create table mycsv(id int not null)engine = csv;
クエリOK、影響を受ける行は0(0.02秒)

次に、データディレクトリに移動してmycsv.CSVを削除し、CSVファイルをmycsv.CSVとして移動/コピー/シンボリックリンクします。mysqlに戻って入力するflush tables;と、準備が整います。(注:動作しない可能性があるため、最初\r\nに変換する必要がある場合があります\n)。

InnoDBを使用している場合、問題は、挿入されたすべての行の各取り消しログエントリを追跡する必要があり、これには多くのリソースが必要であり、非常に時間がかかることです。メモリ内のほとんどの取り消しログ追跡を実行できるように、小さなバッチで実行することをお勧めします。読み込みの途中でctrl-cを実行し、ロールバックする必要がある場合に備えて、取り消しログがあります。そのバッチがロードされた後は、それを追跡する必要はありません。一度にすべてを行う場合は、それらのすべての取り消しログエントリを追跡する必要があり、おそらくディスクに移動する必要があります。これはキラーです。

データを分析するために1つの長いプログラムを実行する場合のように、行レベルのロックを実行しないことがわかっている場合は、データにmyisamを使用することを好みます。テーブルはロックされていますが、実行する必要があるプログラムは1つだけです。さらに、いつでもマージテーブルを使用できます。それらはmyisamテーブルを取り、それらを1つのテーブルにグループ化できます。各テーブルが1か月のデータであるログファイルに対してこれを行うのが好きです。それから私は1年間のマージテーブルを持っています。マージテーブルはデータをコピーせず、各myisamテーブルを指すだけです。

于 2013-03-16T23:48:40.147 に答える