批量导入至 AWS Aurora - 指数插入时间

批量导入至 AWS Aurora - 指数插入时间

我们正在尝试将一个大型表(358M 条记录,160GB 未压缩)文件加载到 aurora。我们尝试了几种组合,但似乎没有达到我们想要的效果。

  1. 如果我们创建主键和分区架构,然后尝试批量插入 - 它永远不会完成。插入时间呈指数级增长。即使我们在批量插入之前对记录进行预排序,情况也是如此。

  2. 如果我们在没有主键和索引的情况下批量插入 - 它会完成,但随后我们无法稍后添加主键。

桌子

客户表,以 customer_id 作为主键,大整数。我们还有其他四个外键 - 我们称之为 fk1、fk2、fk3、fk4 - 全部是大整数。我们只希望这些列被索引,而不是实际的外键。

此外,我们还有 40 个其他列 - 大部分是 varchars 和一些时间戳

方法 1:不使用主键/索引

服务器 - db.r3.large 客户端 - m4.large,Amazon Linux 实例

我们创建了没有主键或索引的表模式。我们对完整的 160GB 文件运行了 mysqlimport。加载数据库大约需要 3 个小时。

此后,我们运行 alter table 来创建主键。它失败并显示错误消息“ERROR 1114 (HY000): 表已满”。

我们认为这是因为临时磁盘已满(参见https://forums.aws.amazon.com/message.jspa?messageID=691512#691512),所以我们将数据库服务器升级到 db.r3.xlarge。我们再次遇到同样的错误,在插入记录后我们放弃了创建主键的尝试。

方法 2:分区和预排序数据

接下来,我们决定对客户表进行分区,希望这会有所帮助。我们想在 FK1 上进行分区,因此我们最终将主键重新定义为 (FK1, customer_id) 以适应 MySQL 的分区规则。

然后,我们根据 FK1、customer_id 对输入文件进行排序,然后将文件分成每个文件 10M 条记录的块。

我们创建了具有主键(FK1,customer_id)和FK1上分区的模式。

最后,我们在单线程循环中导入了 36 个文件。我们设置了以下连接属性 -

SET FOREIGN_KEY_CHECKS = 0;
SET UNIQUE_CHECKS = 0;
SET SESSION tx_isolation='READ-UNCOMMITTED';

最初,每个文件在 10 分钟内完成(即每分钟插入 1M 条记录)。但当记录达到 100M 条记录后,每个文件的处理时间就呈指数级增长。第 13 个文件花费了 16 分钟,第 20 个文件花费了 175 分钟,而第 21 个文件花费了大约 280 分钟。我们当时就放弃了。

在导入过程中,服务器指标比较正常 - CPU 利用率不高,网络 IO 下降。有趣的指标是读取次数一直单调增加,而写入次数一直单调减少。两个图看起来都像朝相反方向发展的阶跃函数。

当前状态

我们放弃尝试创建主键和分区表。相反,我们只是在 customer_id 上创建了一个非唯一索引。

关于我们如何插入与主键相关的记录,有什么线索吗?

相关内容