2016-08-08 6 views
1

私は、ofstreamで普通のバイナリファイルに書き込んでいるのと同じ速度でMYSQL DBテーブルに書き込みたいと思います。普通のファイルに書き込んでいるかのようにMYSQL DBに書き込む方法

通常、ofstreamを使用してファイルに100Mバイトを書き込むのにかかる時間は1秒未満です。

MYSQLでは、これらの100Mバイトを9秒以上で挿入しましたが、これは非常に長い時間です(MYISAMテーブルと複数行の挿入文を使用しました)。言い換えれば

、私はそれが(パースチェックし、...など)を行うものではありませんようにMySQLを設定したい、それはとてもバイナリファイル

たかのようにちょうどテーブルへの書き込みがあり、それを達成する方法は?

編集1:挿入どこMAXに使用されるコードのためのスニペットここ

されています。ここでは

は、私が移入するテーブル、

create table Frames 
(
f1 varchar(8) not null , 
f2 varchar(6) not null , 
f3 varchar(6) not null , 
f4 varchar(2) not null , 
f5 varchar(4), 
f6 varchar(16000), 
f7 varchar(4) not null 
); 

編集2でありますが10000に設定されている。

for (int c = 0; c < 100; ++c) 
{ 
    string query("insert into Frames (f1,f2,f3,f4,f5,f6,f7) values"); 
    for (int i = 1; i <= MAX; ++i) 
    { 
    query += "('AAAAAAAA','000001','000002','05','5005','000000000100000000010000000001000000000100','MKJE')"; 
    query += (i==MAX) ? ";" : "," ; 
    } 
    if (mysql_query(conn, query.c_str())) { 
    fprintf(stderr, "%s\n", mysql_error(conn)); 
    return(1); 
    } 
} 

おかげであなたはあなたのために良いですパフォーマンスを見つけるまで

+1

インデックスを作成してから挿入してから、ジョブが完了したら作成し直すことをお勧めします。インデックスは挿入、更新、削除の操作に影響します – jonju

+0

テーブルの説明を貼り付けます – rocks

+0

@jonju:実際には、テーブルにインデックスはありませんが、書き込みはまだ遅いです... –

答えて

1

speed of INSERTを改善するためにさまざまなトリックを使用できます。このリンクはMySQLのマニュアルにあります。このマニュアルにはたくさんのヒントがあります。

しかし、ファイルに直接書き込む速度に近づくことはありません。 MySQLは、SQLの解析、アクセス権限の強制、データ制約の適用、データのコンパクト表現への変換、ファイルへのデータの効率的な編成、およびインデックスの更新のために、数多くの追加作業を行っています。

ストレージエンジンとしてInnoDB(デフォルト)を使用している場合は、更新する主キーインデックスは常に少なくて済みます。 InnoDBはテーブルデータをクラスタードインデックスとして格納します。

ファイルに追加するのと同じ速度を実際に得ることができる唯一の方法は、CSV storage engineをそのファイルに直接追加することです。つまり、SQLをまったく使用せず、データファイルに書き込むだけです。ファイルが適切な場所にあり、正しい名前を持っている場合は、MySQLテーブルのデータになります。

+0

CSVストレージエンジンは私の場合は非常に良いアイデアですが、 .frmと.csmファイル.. –

+0

いつものように 'CREATE TABLE'を使い、最後に' ENGINE = CSV'を指定してください。これにより、.csvデータファイルとメタデータファイルの両方が作成されます。次に、データファイルに直接書き込むことができます。 CSVエンジンには欠点もあることに注意してください。インデックスなし、トランザクションなし、自動インクリメントなし、パーティションなし、NULL可能な列なし。 –

+0

これは完璧なソリューションです、ありがとう –

0

あなたは、次の手順を試してみてください:

  1. LOAD DATA INFILE声明
  2. を試してみてください、あなたのMySQLインスタンスが適切にあなたが持ってチューニングされていると仮定すると、NOSQL
  3. を試してみてくださいdbサーバとネットワークインフラストラクチャを垂直方向にスケールアップする他の選択肢はありません

最終的な考えとして、私はインデックス作成やACIDのようなMySQLの機能は必要ありません。単にファイルに書き込むだけです。 ファイルへの書き込みと同じパフォーマンスを得ることはないため、

+0

実際には、私はLOAD DATA INFILEを試しましたが、普通のファイルに書き込むよりも悪い性能を得ます。 –

+0

@johnsamir次にステップ2に進みます。 – giammin

関連する問題