Я пишу заявку, яка потребує вимивання великої кількості оновлень бази даних протягом тривалого періоду часу, і я зациклювався на тому, як оптимізувати запит. В даний час я використовую INSERT INTO ... VALUES (..), (..) ON DUPLICATE KEY UPDATE
, що працює, щоб об'єднати всі значення в один запит, але виконує болісно повільно на великих таблицях. Мені ніколи насправді не потрібно вставляти рядки.
Інші підходи, які я бачив, - це оновлення з використанням SET value = CASE WHEN...
(що було б важко генерувати завдяки тому, як я будую запити, і я не впевнений у продуктивності CASE
для сотень / тисяч ключів), а також просто кілька об'єднаних оновлення. Чи будь-який із них буде швидшим, ніж мій поточний метод?
Мене бентежить, що, наскільки я можу сказати, в MySQL немає жодного ідіоматичного, ефективного способу зробити це. Якщо насправді не існує способу, який швидше ON DUPLICATE KEY
, чи варто йому перейти на PostgreSQL і використовувати його UPDATE FROM
синтаксис?
Будь-які інші пропозиції також дуже вдячні!
Редагувати: ось одна з таблиць, яка часто оновлюється. Імена стовпців я видалив, оскільки вони не мають значення.
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;