Uzun bir süre veritabanına güncellemeleri çok sayıda temizlemek gerekiyor bir uygulama yazıyorum ve nasıl sorgu optimize etmek için sıkışmış aldım. Şu anda kullanıyorum INSERT INTO ... VALUES (..), (..) ON DUPLICATE KEY UPDATE
, tüm değerleri tek bir sorguda toplu olarak çalışır, ancak büyük tablolarda dayanılmaz yavaş yürütür. Asla satır eklemem gerekmiyor.
Gördüğüm diğer yaklaşımlar kullanarak güncelleme yapmak SET value = CASE WHEN...
(sorguları oluşturma şeklimden dolayı üretilmesi zor olurdu ve CASE
yüzlerce / binlerce anahtarın performansından emin değilim ) ve sadece çoklu birleştirilmiş güncellemeler. Bunlardan herhangi biri şu anki yöntemimden daha hızlı mı olurdu?
Bana söyleyebildiğim kadarıyla MySQL'de bunu yapmanın deyimsel ve etkili bir yolu yok. Gerçekten daha hızlı bir yol yoksa ON DUPLICATE KEY
, PostgreSQL'e geçmek ve UPDATE FROM
sözdizimini kullanmak buna değer mi?
Diğer öneriler de büyük beğeni topluyor!
Düzenleme: İşte sık güncellenen tablolardan biri. Alakasız oldukları için sütun adlarını kaldırdım.
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;