2013-03-13 103 views
0

我有一个MySQL数据表,里面有大约5亿行的数据。我们需要通过读取这些数据来运行计算,并且计算出的数据(这是原始数据的标准化形式)需要写入另一个InnoDB表中。InnoDB Table Bulk Insert

我们现在的设置是一个虚拟云,其中包含一台机器以及数据库,因此机器数据库连接非常快。

发生在数据上(以及读取数据)的计算速度非常快,整个过程的瓶颈是将标准化数据插入InnoDB表(标准化数据包含一些标记,尽管不长,这会降低插入速度)。

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

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

我想问题是,那么将大量数据插入InnoDB表的最佳过程是什么(就输入格式和实际导入而言)?

回答

0

我的第一反应是问你调节缓冲变量...但你说你不能改变太多,服务器配置参数,这里是另一种选择......

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

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

0

在这种情况下,你没有做基表上任何东西 - 最有可能更新只计划时间间隔的基础上二次InnoDB表中的数据,我会perfer以下步骤

  1. 乘坐mysqldump - where(--where“id> 91919”或 - “update_time> now() - interval 1 hour”)选项。如果表中可能避免锁定太
  2. 将数据还原到一个临时数据库表
  3. 做你的计算上临时DB和更新辅助表
  4. 降创建临时DB /表。
+0

感谢您的评论。不过,我对你指的是什么感到困惑。我的表格(包含数据的原始表格和包含标准数据的目标表格)都在同一个MySQL实例上。我需要找到将我计算的值插入到标准表中的最快方法。请让我知道如果还有什么不清楚! – user1094786 2013-03-13 19:41:52

+0

作为您的第一张桌子,我只是将相关数据提取到一张小桌子上,计算新的字段并更新第二张桌子。我更喜欢** mysqldump ** over **创建临时表select * from表where <> **,因为它也会阻止锁。 – georgecj11 2013-03-13 19:56:13

0

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

+0

嗨,欢迎来到Stack Overflow!一个可能的解决方案的链接总是受欢迎的,但请在链接上添加上下文,以便您的同行用户可以了解它是什么以及它为什么在那里。始终引用重要链接中最相关的部分。想象一下,页面被移动到另一台服务器,或直接链接改变 - 未来的用户将无法从答案中获益。看看[如何回答](http://stackoverflow.com/questions/how-to-answer)。 – Jesse 2013-03-20 01:55:11