0

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

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

对数据进行的计算(以及读取)非常快,整个过程的瓶颈在于将标准化数据插入 InnoDB 表(标准化数据包含一些指标,虽然不长,但减慢插入)。

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

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

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

4

3 回答 3

0

我的第一直觉是要求您调整缓冲区变量。但是正如您所说,您不能更改很多服务器配置参数,这是另一种选择...

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

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

于 2013-03-14T04:37:16.423 回答
0

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

  1. 使用--where (--where "id>91919" 或 --where "update_time > now() - interval 1 hour ") 选项进行 mysqldump。如果可能的话也避免锁定表
  2. 将数据恢复到临时数据库表
  3. 在临时数据库上进行计算并更新辅助表
  4. 删除创建的临时数据库/表。
于 2013-03-13T17:42:32.550 回答
0

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

于 2013-03-20T01:35:24.243 回答