【问题标题】:Update or insert a mysql database with 60 million entries更新或插入包含 6000 万个条目的 mysql 数据库
【发布时间】:2017-05-02 05:25:21
【问题描述】:

我有一个 mysql 数据库,其中有一个表,其中包含大约 6000 万个条目,主键为“x”。我有一个数据集(csv 文件),其中也有大约 6000 万个条目。该数据集还具有索引“x”。对于 mysql 表和数据集共有的键 'x' 的值,mysql 表中的相应条目只会随着增量更新为计数器变量。将插入数据集中的新数据。

一个简单的串行执行,我们尝试更新条目(如果存在),否则插入大约需要 8 小时才能完成。我可以做些什么来提高整个过程的速度?

【问题讨论】:

  • INSERT INTO ... ON DUPLICATE KEY UPDATE
  • 数据集是什么意思? CSV 文件?数据库没有条目,但数据库中的表有。您的术语不清楚。
  • 是的数据集是一个 csv 文件。数据库是指数据库中的表。

标签: mysql database optimization


【解决方案1】:

计划 A:IODKU,正如 @Rogue 建议的那样。

Plan B:两个 sql;它们可能运行得更快,因为 8 小时的一部分时间正在收集大量的撤消信息以防崩溃。 normalization section 接近这两个查询。

计划 C:遍历这对表,使用其中一个表的 PRIMARY KEY 以块的形式(例如 1000 行)执行 IODKU。查看我的Chunking 代码(并将其从DELETE 调整为IODKU)。

在计划 B 和 C 中,打开 autocommit,这样您就不会建立巨大的重做日志。

计划 D:在将两个表与 JOIN 合并时构建一个新表。以原子结束

RENAME TABLE real TO old,
             new TO real;
DROP TABLE old;   -- when happy with the result.

计划 E:计划 D + INSERT ... SELECT real JOIN tmp ... 的分块

【讨论】:

  • 谢谢。让我尝试其中的一些,看看我的效率如何。
猜你喜欢
  • 2014-11-01
  • 2011-07-23
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
相关资源
最近更新 更多