私のアプリ(MySQLを使用している)は、後続のupsertsを多数実行しています。今、私のSQLは次のようになります。できるだけ速いupsertsを大量に実行する
INSERT IGNORE INTO customer (name,customer_number,social_security_number,phone) VALUES ('VICTOR H KINDELL','123','123','123')
INSERT IGNORE INTO customer (name,customer_number,social_security_number,phone) VALUES ('VICTOR H KINDELL','123','123','123')
INSERT IGNORE INTO customer (name,customer_number,social_security_number,phone) VALUES ('VICTOR H KINDELL OR','123','123','123')
INSERT IGNORE INTO customer (name,customer_number,social_security_number,phone) VALUES ('TRACY L WALTER PERSONAL REP FOR','123','123','123')
INSERT IGNORE INTO customer (name,customer_number,social_security_number,phone) VALUES ('TRACY L WALTER PERSONAL REP FOR','123','123','123')
これまでのところ私はアップサートを達成するための最速の方法であることをINSERT IGNORE
を見つけました。レコードが存在するかどうかを確認するためにレコードを選択し、それを更新するか、新しいレコードを挿入するのは遅すぎます。各レコードごとに個別のステートメントを行う必要があるため、これは私が好きなほど速くはありません。時には、これらのステートメントのうち約50,000を連続して使用することがあります。
既存のレコードを削除せずに、これらのすべてを1つのステートメントで処理する方法はありますか?
このようなINSERT IGNOREを使用すると、レコードが1つでも存在してもクエリ全体を無視しないでしょうか?残念ながら、長い説明が必要な理由で、 'ON DUPLICATE KEY UPDATE'を使用することはできません。 –
'IGNOREキーワードを使用すると、INSERT文の実行中に発生するエラーは、代わりに警告として扱われます。たとえば、IGNOREを使用しない場合、テーブル内の既存のUNIQUEインデックスまたはPRIMARY KEY値を複製する行によって重複キーエラーが発生し、そのステートメントは中止されます。 IGNOREでは、行はまだ挿入されませんが、エラーは発行されません。 ' – dkarp
'REPLACE INTO'もオプションですが、既存の行を削除して置換するため、INSERT IGNOREより効率が悪くなります。 – dkarp