ホームページ  >  記事  >  バックエンド開発  >  mysql - PHP の一括挿入および更新の問題

mysql - PHP の一括挿入および更新の問題

WBOY
WBOYオリジナル
2016-07-06 13:54:101531ブラウズ

問題を挿入

PHPが大量のデータをバッチ処理する場合、私が考える解決策は次のとおりです

方法 1: foreach ループのトラバーサルで SQL ステートメントを構築し、それをデータベースに挿入します
xxx の値 (xxx, xxx, xxx) に挿入します

方法 2: foreach ループは SQL ステートメントを構築するために走査し、最後に
insert into xxx (field1, field2, field3) の値 (xxx1, xxx2, xxx3), (xxx1, xxx2, xxx3) を挿入します

上記は挿入のみです。挿入時に挿入されたデータがデータベースに存在するかどうかを最初に確認したい場合は、各挿入の前に選択操作を実行する必要があります。これは非効率ですか?ハマグリを最適化するにはどうすればよいですか?

質問を更新しました

実際には、更新する前に選択します。存在しない場合は、それを最適化する方法があります。

返信内容:

問題を挿入

PHPが大量のデータをバッチ処理する場合、私が考える解決策は次のとおりです

方法 1: foreach ループのトラバーサルで SQL ステートメントを構築し、それをデータベースに挿入します
xxx の値 (xxx, xxx, xxx) に挿入します

方法 2: foreach ループは SQL ステートメントを構築するために走査し、最後に
insert into xxx (field1, field2, field3) の値 (xxx1, xxx2, xxx3), (xxx1, xxx2, xxx3) を挿入します

上記は挿入のみです。挿入時に挿入されたデータがデータベースに存在するかどうかを最初に確認したい場合は、各挿入の前に選択操作を実行する必要があります。これは非効率ですか?ハマグリを最適化するにはどうすればよいですか?

質問を更新しました

実際には、更新する前に選択します。存在しない場合は、このように最適化します。

1- Mysql には REPLACE INTO の構文もあり、存在する場合は更新され、存在しない場合は挿入されます。
2- Mysql には INSERT INTO... ON DUPLICATE KEY UPDATE の構文もあり、存在する場合は更新されます。 3- 実際の開発では、少なくとも 1,000 項目以下のデータを大量のバッチとして挿入することは非常にまれであるため、手間を省きたい場合は、通常、次のような予測を検証します。怠け者で4時間節約できれば、それによって引き起こされるトラブルは8時間寝ていれば十分です。

通常、古いデータベースからデータをインポートするときに大量のデータのバッチ挿入が発生しますが、この種のインポートは通常 1 回だけであるため、アップロードされた CSV ファイルからのデータのインポートなど、他の処理についてはあまり真剣に考える必要はありません。特定のビジネス ロジックでは、挿入に try/catch を使用するのが一般的です。失敗したデータが表示され、ユーザーは上書きを確認してから更新できます。

1) 挿入でデータが重複しないことが保証できる場合は、挿入の方が確実に適しています。

2) Index~、適切なインデックスはパフォーマンスを向上させるのに非常に役立ちます。3) mysql バッチインポートを使用すると、パフォーマンスが向上します。間違いなく役立ちますが、データが失われる可能性があるという欠点があります。
4) auto-commit=true に設定し、トランザクションを終了し、複数のレコード (1W レコードなど) を送信した後に 1 回コミットします。また、1W QPS を設定するのも非常に簡単です。単一マシン
5 ) mysql ライブラリを再設計し、読み取りと書き込みを分離し、クラスターを作成し、SSD をインストールします...

REPLACE は挿入が存在する場合は削除し、DUPLICATE が存在する場合は更新します

置換を使用すると、更新と挿入の問題を解決できます

重複キーの更新時 これを使用して、重複したくないフィールドごとに一意のインデックスを作成します。これにより、挿入するか更新するかを確認する必要がなくなります。 UPDATEに続くステートメントを繰り返し実行することで自動的に実行することができます

REPLACE と DUPLICATE を使用する必要はありません。次のことを試してください。

トランザクションを開始して、挿入が失敗した場合は、代わりに更新します。 リーリー

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。