生成一个巨大的150M行MySQL表

bri*_*vis 5 mysql database

我有一个C程序,它挖掘一个巨大的数据源(20GB的原始文本)并生成大量的INSERT,以便在简单的空白表(4个带1个主键的整数列)上执行.设置为MEMORY表格,整个任务在8小时内完成.完成后,表中存在大约1.5亿行.八小时对我来说是一个完全合适的数字.这是一次性交易.

当尝试将MEMORY表转换回来时问题就出现MyISAM了(A)我将为其他进程释放内存,以及(B)当我重新启动计算机时数据不会被杀死.

ALTER TABLE memtable ENGINE = MyISAM
Run Code Online (Sandbox Code Playgroud)

我现在让这个ALTER TABLE查询运行了两天多,而且还没有完成.我现在已经杀了它.

如果我最初将表创建为MyISAM,则写入速度似乎非常差(特别是由于查询需要使用该ON DUPLICATE KEY UPDATE技术).我不能暂时关掉钥匙.如果我去的话,那个表会变得超过1000倍然后我必须重新处理密钥并且基本上在150,000,000,000行上运行GROUP BY.嗯,不.

要实现的关键约束之一:INSERT查询UPDATE记录表中是否存在主键(哈希).

在尝试严格使用MyISAM的初期,我的速度达到每秒1,250行.一旦指数增长,我想这个利率会更高.


我在机器上安装了16GB的内存.什么是生成大型表的最佳方法,最终最终成为磁盘上的索引MyISAM表?


澄清:查询(INSERT ... ON DUPLICATE KEY UPDATE val=val+whatever)中有很多很多UPDATE .无论如何,这不是原始转储问题.我MEMORY首先尝试表的原因是为了加速每个INSERT发生的所有索引查找和表更改.

Bre*_*ker 1

很抱歉一直向你发表评论(可能是最后一篇)。

我刚刚发现这篇文章提供了一个将大表从 MyISAM 转换为 InnoDB 的示例,虽然这不是您正在做的,但他使用中间内存表并描述了以有效的方式从内存到 InnoDB 的转换 - 排序内存中的表按照 InnoDB 希望它最终排序的方式。如果您不依赖 MyISAM,那么它可能值得一看,因为您已经构建了“正确”的内存表。