1

ファイルからデータ行を読み取って分析し、ローカルの MySQL データベースに 1 つずつ挿入する PHP スクリプトを実行します。

$mysqli = new mysqli($db_host, $db_user, $db_password, $db_db);
if ($mysqli->connect_errno) {
  echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
} else {
  /* As long as there is data in the file */
  while(...) {
    ... // analyse each row (contained in an object $data)
    /* Write it to the database table. */
    $mysqli->query($data->getInsertQuery($db_table));
  }
}

4000 万のデータ行があります。最初の数百万のデータセットは非常に高速に挿入されましたが、最後の 6 時間で挿入されたのは 200 万だけで (私は現在 3000 万です)、どんどん遅くなっていくようです (これまでのところ、インデックスは定義されていません! )。

これがテーブルにデータを書き込むより効率的な方法であるかどうか疑問に思っていました。可能であれば、余分な (一時) ファイルのないソリューションを希望します。

4

3 に答える 3

2

最初にファイルを SQL ファイルに変換し (ステートメントをファイルに書き留めるようにスクリプトを変更するだけです)、次に mysql コマンド ラインを使用して次のようにロードする方が効率的です。

mysql -uuser -p dbname < file.sql

このような大規模なインポートでは、PHP の使用によるオーバーヘッドを大幅に節約できます。一度に1つのクエリでデータをファイルにストリーミングすることを忘れないでください;)

于 2013-05-21T14:59:49.790 に答える
1

SQL 挿入コマンドを事前に生成してファイルに保存し、データを MySQL にインポートすることができます。

mysql --default-character=utf8 --user=your_user -p your_db < tbl.sql
于 2013-05-21T14:59:38.673 に答える
0

準備されたステートメントを使用して、少し高速化できます。

http://devzone.zend.com/239/ext-mysqli-part-i_overview-and-prepared-statements/を参照してください。「stackoverflow mysqli 準備済みステートメント」についてグーグルで見つけました。

于 2013-05-21T15:19:21.723 に答える