我正在编写一个应用程序,该应用程序需要长时间刷新数据库的大量更新,而我一直沉迷于如何优化查询。目前,我正在使用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;
这是在测试机上而不是生产环境上,因此InnoDB不能完全正确地调整。我不确定INSERT FROM的工作方式,但是您所说的似乎正确。使用您要求的信息更新了问题。
—
jli 2012年