0

オフラインプログラムのウェブサイトへのリンクを作成します。私たちのオフラインプログラムでは、私たちのウェブサイトにプッシュしたい50.000のレコードがあります。私たちが今していることは次のとおりです。

オフラインプログラムでは、1500レコードのxmlファイルを作成し、それをWebサーバーのphpファイルに投稿します。ウェブサーバーでxmlを読み取り、それをmysqlデータベースにプッシュします。その前に、まずレコードがすでに存在するかどうかを確認してから、レコードを更新するか、新しいレコードとして挿入します。

それが完了すると、バッチが完了したというメッセージをオフラインプログラムに返します。オフラインプログラムは、次の1500レコードで新しいxmlファイルを作成します。このプロセスは、最後の1500レコードに達するまで繰り返されます。

問題は、レコードをデータベースにプッシュしている間、Webサーバーが非常に遅くなることです。おそらくそれは、最初に既存のレコードをチェックし(これが1つのクエリ)、次にそれをデータベースに書き込むためです(これが2番目のクエリです)。したがって、バッチごとに3000クエリを実行する必要があります。

このプロセスをスピードアップするためのヒントがいくつかあることを願っています。

前もって感謝します!

4

4 に答える 4

2
  1. インポートを開始する前に、所有しているすべてのデータIDを読み取り、アイテムの挿入ごとにチェッククエリを実行するのではなく、既存のphp配列でチェックします。
  2. データベーステーブルのキーを修正します。
  3. 1つのリクエストですべての挿入を行うか、トランザクションを使用します。

このように大量のデータをインポートするのに問題はありません。私はそれについて多くの経験をしました。

于 2012-09-21T11:01:09.530 に答える
1

セミコロンで区切られたすべての挿入ステートメントの連結で構成される単一のクエリを作成することをお勧めします。

INSERT INTO table_name
        (a,b,c)
    VALUES
        (1,2,3)
    ON DUPLICATE KEY
        UPDATE a = 1, b = 2, c = 3;
INSERT INTO table_name
    ...

100〜500の挿入ステートメントを連結して、トランザクションでラップすることができます。

多くのステートメントをトランザクションにラップすると、各行が挿入された後すぐにデータをディスクにコミットせず、100〜500バッチ全体がメモリに保持され、すべてが完了すると、すべてがディスクに書き込まれるため、役立ちます。これは、断続的なディスクIOが少ないことを意味します。

適切なバッチサイズを見つける必要があります。100〜500を例示しましたが、サーバー構成、ステートメントあたりのデータ量、挿入数と更新数に応じて、微調整する必要があります。

于 2012-09-21T11:13:39.830 に答える
0

私は4か月前に同じ問題を抱えていましたが、phpではなくjavaでより多くのパフォーマンスコーディングを行い、xmlドキュメントを回避しました。ヒント:テーブル全体を読み取って(一度実行すると、多くのクエリを1つずつ実行するよりも高速になります)、このテーブルをメモリに保持できます(たとえば、HashMapで)。また、レコードを挿入する前に、そのレコードが構造体のローカルに存在するかどうかを確認できます(DBを気にする必要はありません)。この方法でパフォーマンスを向上させることができます。

于 2012-09-21T11:03:20.327 に答える
0

Mysqlの一意のインデックス制約に関する情報をお読みください。これは役立つはずです:

Mysqlインデックスチュートリアル

于 2012-09-21T10:57:58.113 に答える