大量の更新をデータベースに長期間フラッシュする必要があるアプリケーションを作成していますが、クエリを最適化する方法に行き詰まっています。現在私はを使用していますINSERT INTO ... VALUES (..), (..) ON DUPLICATE KEY UPDATE
。これは、すべての値を1つのクエリにバッチ処理するように機能しますが、大きなテーブルでは非常に遅く実行されます。実際に行を挿入する必要はありません。
私が見た他のアプローチは、更新を使用SET value = CASE WHEN...
することです(これはクエリを構築している方法のために生成するのが難しくCASE
、数百/数千のキーのパフォーマンスについてはわかりません)、そして単に複数の連結アップデート。これらのどちらが私の現在の方法よりも速いでしょうか?
私の知る限り、MySQLでこれを行うための慣用的で効率的な方法はないことに戸惑います。よりも高速な方法がない場合ON DUPLICATE KEY
、PostgreSQLに切り替えてそのUPDATE FROM
構文を使用する価値はありますか?
他の提案も大歓迎です!
編集:頻繁に更新されるテーブルの1つを次に示します。無関係であるため、列名を削除しました。
CREATE TABLE IF NOT EXISTS `table` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`a` bigint(20) unsigned NOT NULL DEFAULT '0',
`b` bigint(20) unsigned NOT NULL DEFAULT '0',
`c` enum('0','1','2') NOT NULL DEFAULT '0',
`d` char(32) NOT NULL,
-- trimmed --
PRIMARY KEY (`id`),
KEY `a` (`a`),
KEY `b` (`b`),
KEY `c` (`c`),
KEY `d` (`d`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;