2012-01-18 66 views
0

我想700MB的表从MyISAM数据转换使用下面的命令InnoDB的:为什么从MyISAM转换到InnoDB需要永久?

ALTER TABLE table_name ENGINE = InnoDB; 

我不知道为什么它永远了(它没有完成,我杀了等待一个小时后查询)。我观察到,我的记忆体使用率攀升至60%,平稳。我怀疑调整一些参数可能有帮助,但我不知道哪一个。

+0

定义“永远”。你写得像是花了很长一段时间,但并不是永远。知道它是否完成,需要多长时间会很有帮助。 – 2012-01-18 10:33:15

+0

@ todda.speot.is:没有完成。我杀了查询。 – 2012-01-18 10:34:03

回答

2

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

您可以尝试将表转储到SQL中,编辑转储以便创建表语句使用InnoDB而不是MyISAM,然后将其上载回去。我认为它可能会快一点。

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

+0

我的innodb_buffer_pool_size是134MB。你认为还有多少是足够的? – 2012-01-18 10:46:06

+0

对于700MB的桌子?至少1GB;)这里的一般规则是:越多越好。 – Mchl 2012-01-18 10:48:37

+0

你提供了它需要这么长时间的原因。这一次我耐心等待,并在1小时25分钟内完成。不知道是否可以做得更快。 – 2012-01-19 06:32:34

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。“

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

+0

感谢您的参考。我采用了第1点和第3点。但是,700MB桌面和200MB索引仍然花了我1小时25分钟。不知道这是否可以像我一样快。 – 2012-01-19 06:34:15

相关问题