我在Windows Vista 32位上使用MySQL服务器5.0.67,内存为3GB ......
我有一个450万MyISAM行表(表A),我创建了一个C#.NET程序,它遍历每一行,提取某些信息并填充另一个MyISAM表(表B)。对于表A中的每一行,我为表B收集大约80行。表B的结构如下:Field1(整数),Field2(位),Field3(varchar(3)),Field4(mediumint(8)),Field5 (mediumint(8)),Field6(整数),Field1,2,3的组合上有一个唯一的键。
我使用IGNORE ON DUPLICATE KEY UPDATE ...子句插入表B
当我遍历A中的所有行时,程序最初启动OK(每秒大约50行),但是当处理大约120,000行时,它开始变得非常慢。所以我决定将行的插入分成500个较小的表(而不仅仅是表B),其结构与表B相同。大约在1天内完成。
然后我尝试将所有500个表合并到表B中(到目前为止是空的)。我创建了一个运行存储过程的脚本,执行INSERT INTO B SELECT * FROM(500个表中的一个)IGNORE ON DUPLICATE KEY UPDATE ...我这样做了一段时间,我最终决定将大约150个调用分组sp与各自的表,让它一夜之间运行。问题是,在某一点上,在大约100次合并之后,我收到错误“表B.MYI的密钥文件不正确;尝试修复它”。
这可能是因为临时文件可能变得太大了吗?或者是否还有其他原因导致索引损坏?也许是因为它处理的是超过2GB的数据?运行批次的5个合并(而不是150个)是一个更明智的解决方案吗?修理桌子对我来说不是一个选择,因为我无法知道它在错误的小桌子中的位置,因此我必须重新开始并确保它有效。我现在正在考虑使用.msi文件更新到MySQL 5.5.19,但我不知道是否值得麻烦。我只想填充这个表B,然后将其转储并移动到其他地方。我仍然拥有最初的500张桌子,所以如果有人能指出我正确的方向将它们合并为1会很棒!
提前致谢, 添