web-dev-qa-db-ja.com

クエリ構文に置換

「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を超える行を更新できます。

41
kformeck

ドキュメント のように:

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

74
Filipe Silva

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

Shlomi Noachは、REPLACE INTOhere の使用に関する問題について書いています。

しかし、私は次の点に注意する必要があります。使いやすさの観点からあなたが探していたものかもしれませんが、実際には、重複キーでDELETEとINSERTが実行され、これはより詳細な調査を必要とします。

行が削除されるたびに、すべてのインデックス、および最も重要なのはプライマリキーを更新する必要があります。新しい行が挿入されると、同じことが起こります。特にInnoDBテーブルでは(クラスター化されているため)、これはかなりのオーバーヘッドを意味します。インデックスの再構築は費用のかかる操作です。削除時にインデックスノードをマージする必要がある場合があります。 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 INTOmayは実装に適していますが、代わりに INSERT ... ON DUPLICATE KEY UPDATE を使用する方が適切(およびリスクが低い)であることがわかります。

15
Andrew Dunn

またはそのようなもの:

insert ignore tbl1 (select * from tbl2);

UPDATE
        `tbl1` AS `dest`,
        (SELECT * FROM tbl2) AS `src`
    SET
       dest.field=src.field,
       dest.field=if (length(src.field)>0,src.field,dest.field) /* or anything like that*/
    WHERE
        `dest`.id = `src`.id; 
0
emmanuel