在MySQL中将MyISAM转换为InnoDB

时间:2011-08-18 07:11:29

标签: mysql innodb myisam

我有一个最初使用MyISAM设置的模式。我有没有被定义为外键的表之间的关系,但我会将表连接到连接等。显然没有规则可以级联删除/更新等...

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

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

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

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

任何指针?

2 个答案:

答案 0 :(得分:2)

如果不盯着你的代码很难说你可能做错了什么,但你可以尝试一些事情:

  1. 开始加载前运行SET foreign_key_checks = 0;,然后在加载后运行SET foreign_key_checks = 1;以加快插入时间。
  2. 确保您在事务中运行批量插入,这样您每次都不会自动提交。
  3. 看看是否有帮助。

答案 1 :(得分:2)

如果每个插入使用一个插入查询,则将数据插入数据库可能需要很长时间。当你使用mysqldump生成的格式时,它将显着加速,如下所示:

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

另外,如果你想将它插入到myisam表中,那么也没有问题。只需确保您的外键完整性正确。插入所有数据后,对所有表执行此操作:

ALTER TABLE `table` ENGINE = innodb;