mysql - 数以百万计的 MySQL 插入重复键更新 - 非常慢

标签 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 发送它们,因为它更快这样。

有什么解决速度问题的想法吗?

最佳答案

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

关于mysql - 数以百万计的 MySQL 插入重复键更新 - 非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15997675/

相关文章:

mysql - VB.NET多表搜索功能与Mysql

php - 负 SQL 查询

mysql - 此要求的 SQL 查询

sql - 具有递归和默认值的树

带字符串的 SQL 数据透视表

mysql - SparkSQL 中使用窗口函数(dense_rank())进行选择

mysql - 在同一个 Rails 应用程序中同时使用 mongodb 和 mysql 是否有意义?

mysql - replicate-do-table 无法启动 slave mysql

sql - 当我选择持久计算列时,为什么 SQL Server 会出现 “Compute Scalar”?

java - JSP 中的日期比较