Saya sedang menulis sebuah aplikasi yang perlu untuk menghapus sejumlah besar pembaruan ke database untuk jangka waktu yang lama, dan saya terjebak pada cara mengoptimalkan kueri. Saat ini saya menggunakan INSERT INTO ... VALUES (..), (..) ON DUPLICATE KEY UPDATE
, yang berfungsi untuk mengelompokkan semua nilai menjadi satu permintaan, tetapi dieksekusi dengan sangat lambat pada tabel besar. Saya tidak pernah benar-benar perlu memasukkan baris.
Pendekatan lain yang saya lihat adalah memperbarui menggunakan SET value = CASE WHEN...
(yang akan sulit untuk menghasilkan karena cara saya membangun permintaan, dan saya tidak yakin tentang kinerja CASE
untuk ratusan / ribuan kunci), dan hanya beberapa digabungkan pembaruan. Apakah salah satu dari ini lebih cepat daripada metode saya saat ini?
Ini membuat saya bingung, sejauh yang saya tahu, tidak ada cara idiomatis, efisien untuk melakukan ini di MySQL. Jika benar-benar tidak ada cara yang lebih cepat daripada itu ON DUPLICATE KEY
, apakah itu layak untuk beralih ke PostgreSQL dan menggunakan UPDATE FROM
sintaksnya?
Saran lain juga sangat dihargai!
Sunting: inilah salah satu tabel yang sering diperbarui. Saya telah menghapus nama kolom karena tidak relevan.
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;