3

我有一个名为的表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 小时!显然,插入当天的行不能超过一天。我必须找到一种方法来加快插入速度。

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

我的脚本是用 PHP 编写的,但是当我添加行时,我会通过exec直接调用 MySQL 并将命令的文本文件传递给它,而不是使用 PHP 发送它们,因为这样更快。

有什么想法可以解决这里的速度问题吗?

4

1 回答 1

0

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

于 2016-05-04T23:01:14.580 回答