数百万MySQL插入重复密钥更新 - 非常慢

时间:2013-04-14 09:40:53

标签: mysql sql

我有一个名为research_words的表,它有几亿行。

每天我都要添加数千万个新行,其中约5%是全新行,95%是必须添加到该行中某些列的更新。我不知道我用的是哪个:

INSERT INTO research_words
  (word1,word2,origyear,cat,numbooks,numpages,numwords)
VALUES
  (34272,268706,1914,1,1,1,1)
ON DUPLICATE KEY UPDATE
  numbooks=numbooks+1,numpages=numpages+1,numwords=numwords+1

这是一个InnoDB表,主键超过word1,word2,origyear,cat

我遇到的问题是我必须每天插入新行,并且每天插入行需要超过24小时!显然,我不能花费超过一天的时间来插入当天的行。我必须找到一种方法来使插入更快。

对于其他表,我在ALTER TABLE ... DISABLE KEYS;LOAD DATA INFILE方面取得了巨大成功,这使我可以在不到一个小时的时间内添加数十亿行。这将是伟大的,除了不幸的是我正在增加到这个表中的列。我怀疑禁用密钥会有所帮助,因为肯定需要他们检查该行是否存在才能添加它。

我的脚本是在PHP中但是当我添加行时,我通过exec调用直接向MySQL发送它并传递命令的文本文件,而不是用PHP发送它们,因为它以这种方式更快。

在这里解决速度问题的任何想法?

1 个答案:

答案 0 :(得分:0)

老问题,但也许值得一回答。 部分问题源于大量插件基本上一次运行一次,每次插入后都有唯一的索引更新。 在这些情况下,更好的技术可能是选择 n 行插入并将它们放入临时表中,将它们连接到目标表,计算它们的新值(在OP的情况下) IFNULL(dest.numpages + 1,1)等)然后运行另外两个命令 - 插入字段为1的插入和更大的更新。更新不需要索引刷新,因此它们运行得更快;插件不需要相同的ON DUPLICATE KEY逻辑。