61

「replace into」ステートメントを使用して、同じスキーマのテーブルを更新できるようにしたいと考えています。最後に、変更された可能性のある値で大きなテーブルを更新できるようにする必要があります。

開始するために使用しているクエリは次のとおりです。

REPLACE INTO table_name
(visual, inspection_status, inspector_name, gelpak_name, gelpak_location),
VALUES (3, 'Partially Inspected', 'Me', 'GP1234', 'A01');

私が理解できないのは、データベース エンジンが重複行とそうでない行をどのように認識しているのかということです。このデータは非常に重要であり、データが破損する危険を冒すことはできません。「リストされているすべての列が同じ値を持っている場合、それは重複行です」と同じくらい簡単ですか?

これを行う効率的な方法を見つけようとしているので、1分以内に45,000行以上を更新できます。

4

3 に答える 3

98

ドキュメントが言うように:

REPLACE は INSERT とまったく同じように機能しますが、テーブルの古い行が PRIMARY KEY または UNIQUE インデックスの新しい行と同じ値を持つ場合、新しい行が挿入される前に古い行が削除される点が異なります。

于 2013-11-06T19:13:31.367 に答える
28

REPLACE同じまたはインデックスINSERTを持つレコードを上書きするだけの のように機能しますが、注意してください。PRIMARY KEYUNIQUE

Shlomi Noach は、REPLACE INTO こ​​こでの使用に関する問題について書いています

しかし、私のような心の弱い人は、次のことを認識しておく必要があります。これは重量級のソリューションです。使いやすさの点でまさにあなたが探していたものかもしれませんが、実際には、重複したキーでは DELETE と INSERT が実行され、これを詳しく調べる必要があります。

行が削除されるたびに、すべてのインデックスを更新する必要があり、最も重要なのは PRIMARY KEY です。新しい行が挿入されると、同じことが起こります。特に InnoDB テーブルでは (クラスター化された性質のため)、これは多くのオーバーヘッドを意味します。インデックスの再構築はコストのかかる操作です。DELETE 時にインデックス ノードをマージする必要がある場合があります。INSERT のためにノードを分割する必要がある場合があります。REPLACE INTO を何度も実行すると、SELECT/UPDATE または INSERT INTO ... ON DUPLICATE KEY を使用した場合よりも、インデックスが断片化される可能性が高くなります。

また、「行が存在しない場合は作成します。存在する場合は、更新されるだけです」という概念もあります。これは誤りです。行は更新されるだけでなく、完全に削除されます。問題は、そのテーブルに PRIMARY KEY があり、REPLACE INTO で PRIMARY KEY の値が指定されていない場合 (たとえば、AUTO_INCREMENT 列である場合)、新しい行が異なる値を取得し、これが何かではない可能性があることです。あなたは行動の観点から探していました。

REPLACE INTO の多くの使用には、PRIMARY KEY (または他の UNIQUE KEY) の値を変更する意図はありません。その場合は放っておいたほうがいいです。私が見た実稼働システムでは、REPLACE INTO を INSERT INTO ... ON DPLICATE KEY に変更すると、スループットが 10 倍になり (1 秒あたりのクエリ数で測定)、IO 操作と負荷平均が大幅に減少しました。

要約すると、実装には適切REPLACE INTO かもしれませんが、INSERT ... ON DUPLICATE KEY UPDATE代わりに使用する方が適切 (かつリスクが少ない) と感じるかもしれません。

于 2018-01-15T18:47:14.343 に答える