为什么从MyISAM转换为InnoDB需要永远?

时间:2012-01-18 10:30:14

标签: mysql performance

我想用以下命令将700MB表从MyISAM转换为InnoDB:

ALTER TABLE table_name ENGINE = InnoDB;

我不确定为什么它会花费很长时间(它没有完成,我在等待一小时后就终止了查询)。我观察到我的记忆力下降到了60%并且平稳了。我怀疑调整一些参数可能有所帮助,但我想知道哪一个。

2 个答案:

答案 0 :(得分:4)

在MySQL文档中有关于InnoDB的转换discussion of issues

以下是一些亮点/引号:

  • 如果您的表具有唯一约束,则关闭唯一检查 第一:

    SET unique_checks=0;
    ALTER TABLE table_name ENGINE = InnoDB;    
    SET unique_checks=1;
    
  • “为了更好地控制插入过程,可能会更好 插入大表:“

    INSERT INTO newtable SELECT * FROM oldtable
    WHERE yourkey > something AND yourkey <= somethingelse;
    

    插入所有记录后,您可以重命名表格。

  • “在转换大表时,你应该增加大小 InnoDB缓冲池减少磁盘I / O.“

  • “确保没有填满表空间:InnoDB表 需要比MyISAM表更多的磁盘空间。如果是ALTER TABLE 操作空间不足,它开始回滚,这可以采取 如果它是磁盘绑定的小时。“

答案 1 :(得分:3)

因为它基本上需要创建一个新表,复制所有数据,创建新索引并删除旧表。两种存储引擎都有非常不同的方式在磁盘上存储数据,因此转换并不简单。

您可以尝试将表转储到SQL中,编辑转储,以便create table语句使用InnoDB而不是MyISAM,并将其上传回来。我认为它可能会快一些。

另请注意,my.cnf中InnoDB缓冲池的默认值可能非常低,导致InnoDB没有足够的内存来有效工作。