繁体   English   中英

在MySQL中将MyISAM转换为InnoDB

[英]Converting MyISAM to InnoDB in MySQL

我有一个最初由MyISAM设置的模式。 我在未定义为外键的表之间有关系,但是我会将该表与联接等链接。显然,没有级联删除/更新等规则。

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

我正在使用CSV文件从PHP将大约200,000条记录加载到DB中。 最初只花了几分钟,但是自从我换成InnoDB以来,PHP脚本在10分钟后超时,仅处理了7%的CSV文件。

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

要考虑的另一件事是,大约每年一次,我们将需要重新加载200,000条记录的集合并确定哪些记录已更改。 每当我们需要这样做时,可能都不可能从一台发动机切换到另一台。

有指针吗?

很难说出在不盯着代码的情况下可能做错了什么,但是您可以尝试以下几点:

  1. 运行SET foreign_key_checks = 0; 在开始加载之前,然后将SET foreign_key_checks = 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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM