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


9

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

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

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

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


2
列名を入力するのに費やされた簡単な時間よりもテーブルに90列あることをもっと心配しています。(ところで、SQL Serverですべての列を一度にドラッグアンドドロップします。mySQLやPHPで同じことをする場所はありませんか?タイプミスがないので、それが人生を楽にしてくれるかどうかを確認したいと思います。)
HLGEM 2009

1
私は90列はたくさんあることを知っていますが、各列は入力する必要のあるPDF文書の単一のフィールドに関連しており、分割する意味やその方法がわかりません。SQL Serverについての情報をありがとう。列をドラッグアンドドロップすることの意味がよくわかりませんが、見てみましょう。
Joe

1
特定のテーブルのすべての列をリストするselectステートメントを記述し、そこから移動します。
JeffO、2011

ジェフO:私もそれを使用しました。正しく実行すると、非常に強力なテクニックになる可能性があります。コード例を提供できる場合は、それを回答として投稿してください。
FrustratedWithFormsDesigner

回答:


7

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


お返事をありがとうございます。すべてのフィールド(インデックスを除く)はVARCHARSなので、これでうまくいきます(他の値も変換できます)。しかし、field_value列のサイズを最大値(約256文字)に設定する必要があるため、多くのスペースを浪費している可能性がありますが、一部のフィールドには長さ3しか必要ありません。そして、私はあなたが説明したように、それがいかに将来の証明になるかを理解できます。
Joe

4
FWIW、ほとんどのデータベースシステムは、データを格納するために必要なスペースのみを使用します。したがって、VARCHAR(256)フィールドに3文字のみを格納する場合、256バイトではなく3バイトしかかかりません。MySQL内部についてはあまり知りませんが、フィールド全体にパディングされていると驚きます宣言されたサイズ。
TMN

@TMNそれがVARCHARのVARの意味です!可変長文字。これは、DBシステムではなく、データ型の関数(または定義)です。また、VARCHARは可変長であるため、DBは各値の長さを知る必要があるため、メタデータとして長さを格納します。つまり、オーバーヘッドストレージです。したがって、オーバーヘッドのため、VARCHAR(1)は実際には3バイトのデータを使用します。Char(1)の3倍です。
Morons 2012

2
-1、私はこの答えに同意しません。この場合、90列の方がよいでしょう。エンティティに90個のデータポイントがある場合は、それもそうであるように、データを合理的に保ちます。
Morons 2012

@TMNちょうど私のポイントを明確にするために、「だから、あなたはVARCHAR(256)フィールドにのみ3文字を格納する場合、それが唯一の3バイトになります」と述べた真実は、それは5を取り上げる3ないバイトです
低能

7

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

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

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


2
大量の行を挿入する必要がある場合、一括読み込みは確かに有効ですが、この場合、大量の列を持つ単一の行を挿入しています。一括読み込みは効果がなく、おそらく単純なアプローチよりも多くのコードを記述する必要があります。
TMN

-1、この回答は質問のポイントを完全に欠いています
Doc Brown

2

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


2

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

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

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


@gnat:代替ソリューションを提供します。「90列のテーブルへの挿入の書き込み」を「1列のテーブルへの挿入の書き込み」に変更します。説明されているような問題を考えると、それは有効な解決策です。すべてを基本コンポーネントに分解する必要はありません。他の唯一の同様の答えは、完全なNoSQLに移行し、SQLデータベースを完全に排除することを提案したため、やり過ぎです。この答えは、混合アプローチを使用できることを示しています。この単一のデータに対して1列だけを作成します。別の方法として、バイナリ列を用意してpdf全体を保存することも考えられます。
jmoreno 2017年

@gnat:Noviffに自分の言葉で説明する機会を与えます...
jmoreno

@gnatとjmoreno-コメントありがとうございます。私はgnatが私の答えを明確にするのが好きで、私は彼の明確化に基づいて答えを編集しました。
ノビフ2017年

0

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

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

1
これは実際には高速ですか?
Pacerier

@Pacerierいいえ、これは速くはありません。ちょうど別の構文。
Kaspars Foigts、2015

0

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


-1

phpとmysqlを使用してデータベースにデータを挿入するより効率的な方法があります。LOAD COMMANDを使用してデータを挿入できます。非常に高速にデータを挿入します。

このため、fputcsv()関数を使用してデータを含むフラットファイル(たとえば、.csvファイルを使用)を作成します。次に、LOADコマンドを使用してデータを挿入します。構文は次のようになります。

LOAD DATA LOCAL INFILE "C:/downloads/local/my_data_file.csv"
INTO TABLE  my_data
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

-1

以下を試してください。私のために働いた。

フォーム名はデータベースの列名と同じである必要があります

以下のように値を取得します。

foreach ($_GET as $formName => $value) {
    $sql = mysql_query("UPDATE table_name SET $formName = '$value' WHERE ID= $id");
}

まず、foreachループの前にIDを挿入する必要があります。次のようにして次のIDを取得できます。

SELECT MAX(id) FROM .....

idに1を追加して挿入します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.