sql >> データベース >  >> RDS >> Mysql

PHPを介して複数のMySQLテーブルに大きなCSVファイルをインポートする時間効率の良い方法が必要

    StackOverflowデータダンプによって公開されたデータを一括ロードするPHPスクリプトを作成しました。何百万もの行をインポートしますが、それほど時間はかかりません。

    ここにいくつかのヒントがあります:

    • 自動コミットに依存しないでください。 すべての行に対してトランザクションを開始してコミットするオーバーヘッドは膨大です。明示的なトランザクションを使用し、1000行(またはそれ以上)ごとにコミットします。

    • 準備されたステートメントを使用します。 基本的に同じ挿入を何千回も実行しているため、ループを開始する前に各挿入を準備し、ループ中に値をパラメーターとして渡して実行できます。 CodeIgniterのデータベースライブラリでこれを行う方法がわかりません。理解する必要があります。

    • インポート用にMySQLを調整します。 キャッシュバッファなどを増やします。 INSERTステートメントの速度 を参照してください。 詳細については。

    • LOADDATAINFILEを使用します。 もし可能なら。 INSERTを使用してデータを行ごとにロードするよりも文字通り20倍高速です。最後の挿入IDなどを取得する必要があるために取得できないかどうかはわかります。ただし、ほとんどの場合、CSVファイルを読み取り、再配置して複数の一時CSVファイルに書き出す場合でも、データの読み込みはINSERTを使用するよりも高速です。

    • オフラインで実行します。 Webリクエスト中に長時間実行されるタスクを実行しないでください。 PHPリクエストの時間制限により、ジョブが終了します。今日でない場合は、次の火曜日にジョブが10%長くなります。代わりに、Web要求をジョブのキューに入れてから、制御をユーザーに戻します。データインポートをサーバープロセスとして実行し、定期的にユーザーが進行速度を確認できるようにする必要があります。たとえば、これを行うための安価な方法は、インポートスクリプトが「。」を出力することです。一時ファイルに追加すると、ユーザーは一時ファイルの表示を要求し、ブラウザでリロードを続けることができます。ファンシーになりたい場合は、Ajaxで何かをしてください。



    1. jdbcドライバーorg.gjt.mm.mysql.Driverは何のためにありますか?

    2. 選択クエリで自動インクリメントフィールドを生成する方法

    3. ProxySQLとAWSAuroraを使用したデータベース負荷分散

    4. カーソルがOracleのレコードを返すかどうかを確認するにはどうすればよいですか?