InnoDB表批量插入

时间:2013-03-13 15:55:21

标签: mysql insert innodb

我有一个MySQL数据表,其中包含大约五亿行。我们需要通过读取对这些数据进行计算,并且需要将计算出的数据(原始数据的标准化形式)写入另一个InnoDB表中。

我们目前拥有的设置是一个虚拟云,其中包含一台机器和数据库,因此机器与数据库的连接非常快。

数据上的计算(以及读取)非常快,整个过程的瓶颈是将标准化数据插入InnoDB表(标准化数据包含一些指标,但不是很长,这会减慢插入速度。)

不幸的是,我们无法修改某些系统变量,例如innodb_log_file_size(我们使用的是亚马逊AWS),这有助于提高插入性能。

将所有这些数据推送到MySQL的最佳方法是什么?由于计算过程很简单,我几乎可以编写一个Python脚本来获取标准化数据并以任何格式输出。在计算发生时动态插入这些数据非常缓慢,并且随着时间的推移变慢。

我想问题是,将批量数据插入InnoDB表的最佳流程(输入格式和实际导入)是什么?

3 个答案:

答案 0 :(得分:0)

在这种情况下,由于您没有在基表上执行任何操作 - 并且最有可能仅在计划间隔的基础上更新辅助innodb表中的数据,我将按照以下步骤进行操作

  1. 使用 - ( - 其中" id> 91919"或 - 其他方式获取mysqldump " update_time> now() - 间隔1小时")选项。如果可能的话,也要避免锁定表格
  2. 将数据还原到临时数据库表
  3. 在临时数据库上进行计算并更新辅助表
  4. 删除创建的临时数据库/表。

答案 1 :(得分:0)

我的第一直觉是要求你调整你的缓冲区变量..但正如你所说的那样,你无法改变很多服务器配置参数,这是另一种选择......

进行计算并将输出转储到csv中。您可以使用'SELECT ... INTO OUTFILE'命令。 然后,您将连接到目标InnoDB,并执行'set autocommit = 0',然后执行'load data local infile'将此CSV加载回目标表。最后将自动提交回到1。

我可以提出许多其他选项(例如正确的分区模式,主键顺序插入等),但我需要知道数据库的结构,传入的数据集和索引。

答案 2 :(得分:0)

你的时间序列数据?上周有类似的问题。加载分区,它变得更快。我还从http://www.ajaydivakaran.com/2013/03/12/mysql-innodb-when-inserts-start-slowing-down/优化了我的设置但是如果你不能优化,那么使用分区来加快插入速度。