0

mls property search( PHRETS )の後に大きなデータを db に挿入しようとしています。結果オブジェクトには約 4500 から 5000 のレコードがあり、それぞれに 450 から 475 のキーがあります。サーバーの時間制限のため、しばらくして (通常は 6 から 7 分後) データベースにデータを挿入しているときに「HTTP エラー 500 内部サーバー エラー」が発生します。サーバー担当者に実行の制限時間を増やすように依頼しましたが、それでもエラーが発生します

ここに私の実行のプロセスがあります

1) プロパティを mls で検索します

2) 実行時間を節約するために Implode を使用してすべてのレコードを一度に挿入しようとしています

$qry=mysqli_query($link,"INSERT INTO `rets_property_res` VALUES implode(',', $sql)");

-準備されたステートメントを使用してみました

このデータをどこかに保存して、後で一度に処理することはできますか、それともプロセスを高速化して、指定された時間内にすべてが機能するようにすることはできますか

4

2 に答える 2

1

これを達成する最速の方法は、大きなチャンク (数千行) を取得し、それを CSV にブラストアウトして、LOAD DATA INFILEを実行することです。LOCAL一部の環境では、サーバーの設定により、LOAD DATA LOCAL INFILE .... の部分を使用する機能がありません。上記のリンクには、これに対する別のリンクがあります。

テキスト ファイルからテーブルをロードする場合は、LOAD DATA INFILE を使用します。これは通常、INSERT ステートメントを使用するよりも 20 倍高速です。セクション14.2.6「LOAD DATA INFILE 構文」を参照してください。

私はそれが簡単に真実であることを発見しました。

確かに遅くなりますが、個々の挿入よりも速度が向上するのは、複数の挿入を 1 つのステートメントにまとめることです。

insert myTable (col1,col2) values ('a1','b1'), ('a2','b2'), ('a3','b3');

したがって、上記の例では、1 つのステートメントで 3 行が挿入されます。通常、速度のためには、一度に 500 から 1000 行 (3 行ではなく) をいじるのが最善です。それはすべて、その挿入ステートメントのスキーマに基づく文字列サイズに依存します。

セキュリティ上の懸念: 第 2 レベルの SQL インジェクション攻撃の可能性に注意する必要があります。しかし、それは可能です。

上記のすべては些細なことのように思えるかもしれませんが、逸話的な例と UX の痛みのコメントとして、以下を提供します。Stackoverflow から質問を取得し、それらのメトリクスを格納する ac# アプリケーションがあります。本文の部分や回答ではなく、タイトルと多くのカウントと日時です。私は自分のデータベースに一度に 1000 の質問を挿入します (または、 またはinsert ignoreを実行しますinsert on duplicate key update)。それを変換する前にLOAD DATA INFILE、再利用されたプリペアド ステートメントを使用して c#/mysql バインディングを実行するには、1000 あたり約 50 秒かかります。変換後LOAD DATA INFILE(worktableのtruncate、csv書き込み、insert文含む)だと1000行あたり約1.5秒かかります。

于 2016-06-18T15:53:02.717 に答える
0

通常、MySQL の最大パケット サイズの制限により、一度に 5000 行を挿入することはできません(各挿入に含まれるデータの量によって異なります)。

小さなグループに分けて挿入してみてください。たとえば、一度に 100 個以下にします。

于 2016-06-18T13:02:41.647 に答える