web-dev-qa-db-ja.com

大きなデータセットをMySQLデータベース(または一般的なデータベース)に挿入する最良の方法は何ですか

PHPプロジェクトの一部として、MySQLデータベースに行を挿入する必要があります。これには慣れていることは明らかですが、1つのクエリで90列に挿入する必要がありました。結果のクエリひどくモノリシックに見える(特にmy PHP変数を値として挿入)):

INSERT INTO mytable (column1, colum2, ..., column90) 
VALUES
('value1', 'value2', ..., 'value90')

そして、私はこれを正しい方法で行っていないのではないかと心配しています。また、すべてを入力するだけでも長い(退屈な)時間を要し、テストコードの作成も同様に退屈な作業になると心配しています。

専門家はこれらのクエリをすばやく作成してテストするにはどうすればよいですか?プロセスをスピードアップできる方法はありますか?

9
Joe

ジョー、あなたの最後のコメントはたくさん説明しました。本当の問題はデータ設計だと思います。ドキュメントの形式が変更されると、新しい列が必要になる場合があります。私の経験では、ドキュメントの形式は頻繁に変更される傾向があります。レポートごとに1つの行がある90列のテーブルの代わりに、4つの列(report_id、format_id、field_name、field_value)を持つテーブルにレポートデータを格納します。各レポートは、レポートのフィールド値ごとに1つずつ、90行で表されます。これにより、コードが大幅に簡略化されます。

7
kevin cline

一般に、大きなデータベースをSQLデータベースにロードする最も速い方法は、ネイティブのバルクロードインターフェースを使用することです。私の知る限り、すべてのSQL dbmsには少なくとも1つあります。

MySQLドキュメント: Bulk Loaderの使用

タブ区切りまたはカンマ区切りのファイルをSQL INSERTステートメントに変換するhaveの場合、awkを使用して入力ファイルを読み取り、出力ファイルに書き込みます。 awkについて特別なことは何もありません。それはたまたま私が最もよく知っているテキスト処理言語です。 Perl、Python、Ruby、Rexx、LISPなどでコードを記述しても、同じ結果が得られます。

列名をExcelスプレッドシートに簡単に取り込むことができる場合は、Excelマクロを記述して、さまざまなクエリとDMLステートメントのコードを生成し、値を別の列に貼り付けるだけで、挿入/更新ステートメントが自動的に作成されます。手動で入力するのは非常に遅い方法です。既存のツールを使用してトリックを見つけることができるかどうか確認してください。多くの開発者指向のテキストエディターには、マクロを記録および保存して、このような反復的な作業をはるかに速く簡単に行う機能もあります。

複数列のクエリデータをMySQL DBに書き込む効率的な方法は、これらのデータをJSONまたはYAML形式に変換し、単一のユニットとして挿入することです。 「90列のテーブルに挿入を書き込む」を「1列のテーブルに挿入を書き込む」に変更します。

このアプローチでは、すべてをその基本コンポーネントに分解する必要はありません。単一のデータは1列だけに格納されます。

2
Noviff

Csvファイルがある場合は、 LOAD DATA INFILE ... を使用してデータをインポートできます。

「INSERT」クエリを使用する必要がある場合は、一括挿入を実行するとプロセスが高速化します。すべての行に対して 'INSERT'クエリを実行する代わりに、行をグループ化して(たとえば100)、クエリを実行します。このようなもの:

INSERT INTO theTable (col1, col2, col3,....., col89, col90) 
VALUES
(val11, val12, val13, ........, val189, val190),
(val21, val22, val23, ........, val289, val290),
.......
......
(val101, val102, val103, ........, va1089, val1090);
2
Srisa

MySQLでは、insertステートメントに代替構文を使用できます。

insert into table
        set column1 = value1
          , column2 = value2
          , column3 = value3
0
Kaspars Foigts

属性リストはフォーマットが変更されるといつでも変更できるため、シナリオはNoSQLソリューションに非常に適しているように見えます。 MySQL以外のオプションを評価しましたか? DynamoDB/MongoDB/Cassandraについて調べてください。