非常に大きな xml ファイルを mysql db にインポートする速度を上げたいので、すべてのクエリを SQL ファイルにダンプし、コンソールで実行することにしました。
しかし、私の問題は、すべてのデータを単純に挿入できないことです。
一部のテーブルがリンクされているため、非常に高速LOAD DATA INFILE
な機能を使用できません。だから私はSQLファイルにクエリを入れたいのですが、いくつかの制御操作が必要です。
そのIDを使用して別のテーブルにデータを追加できるようにするために、そのID(主キーとして)が必要なデータセットがあります。
だから私がmysqlコンソールで試したのはこれです:
INSERT IGNORE INTO tableA VALUES ( A, B, C);
SET @id = LAST_INSERT_ID();
IF( @id, SELECT 1, SELECT id INTO @id FROM tableA WHERE a=A and b=B and c=C);
INSERT INTO tableB VALUES ( @id, B, C);
明らかに IF ステートメントは機能しません。「SELECT IF」でのみ機能します。
私がやろうとしているのは、INSERT IGNORE を使用してデータセットを tableA に追加することです。そのため、重複したエラーは無視されます。新しい行を追加する場合、LAST_INSERT_ID() で @id を取得します。重複する @id がある場合は空ですが、IF チェックでその重複を選択して @a に入れるので、いずれにしても@id セット。次に、@id を使用してデータを tableB に配置し、正しいリンクを作成します。
このワークフローを IF で実行する可能性はありますか? LOAD DATA INFILE を使用するための単純な CSV を作成できないため、いくつかのチェックを行う必要があるリンク テーブルがあるため、SQL を生成するのが最善だと思います。
私の XML ファイルは 20 ~ 25GB ほどの大きさです。私の perl スクリプトは、すべてのチェックを実行してデータベースにインポートするのに 3 週間ほどかかりますが、実行するすべての mysql クエリのために非常に遅くなります。クエリ フローを制御できれば、perl スクリプトのすべてのチェックを使用して何百万ものクエリを実行する代わりに、大きな SQL ファイルを作成できます。
これが可能であることを教えてください。