2011-08-18 100 views
0

我有一个最初使用MyISAM设置的模式。我之间有没有定义为外键的表之间的关系,但我会链接表与连接等。显然没有级联删除/更新等规则...在MySQL中将MyISAM转换为InnoDB

我重新创建相同的数据库模式与InnoDB,但这次我把外键放入创建语句并定义了更新/删除规则。

我使用PHP从CSV文件中将大约200,000条记录加载到数据库中。它最初需要几分钟时间,但自从我交换到InnoDB后,PHP脚本在10分钟后超时,只处理了约7%的CSV文件。

我很想回到没有关系的MyISAM,但是更好的解决方案(如果可能的话)是在初始填充数据库时使用MyISAM,然后切换回InnoDB并让MySQL修复关系。我不知道这是否可行,但我认为如果是这样,MySQL可以修复它自己的内部数据结构,而不是逐个PHP插入。

需要考虑的另一件事是,大约每年一次,我们需要重新载入一组200,000条记录并确定哪些记录发生了变化。当我们需要这样做时,可能无法从一台引擎切换到另一台引擎。

任何指针?

+0

MySQL的版本?另外,直接回答:http://stackoverflow.com/questions/2167522/innodb-takes-over-an-hour-to-import-600mb-file-myisam-in-a-few-minutes/2167641#2167641 –

+0

MySQL Version 5.5.8 – Ozzah

+0

您是否修改innodb变量以获得更好的性能,还是全部使用默认设置? –

回答

2

如果您对每个插入使用一个插入查询,那么将数据插入数据库可能需要很长时间。

INSERT INTO `table` (field1, field2, field3) 
VALUES 
(value, value, value), 
(value, value, value), 
(value, value, value); 

另外,如果您想将它插入到MyISAM表,无论如何,没有任何问题之一:当您使用的mysqldump生成的格式,这样它会显著加快。只要确保你的外键完整性是正确的。插入所有数据后,对所有表执行此操作:

ALTER TABLE `table` ENGINE = innodb; 
+0

哇,我不知道你可以将它们链接成一个查询。 – Ozzah

2

很难说你可能是错的做什么,不会在您的代码盯着,但一对夫妇的事情,你可以尝试:

  1. 运行SET foreign_key_checks = 0;,然后再开始加载,然后SET foreign_key_checks = 1;大功告成加载后加快插入时间。
  2. 确保您正在事务中运行批量插入,因此您每次都不会自动提交。

看看是否有帮助。