MySQL 转换/修改表存储引擎 详细介绍

MySQL表转换(转换/修改表存储引擎):

有几种方法可以吧表从一种引擎转移到另外一种引擎上,都有自己的优缺点。下面介绍3种常用的方法。


一:ALTER TABLE

把表从一种引擎转移到另外一种引擎最简单快捷的方法用ALTER TABLE语句:

mysql>ALTER TABLE mytablename ENGINE = 引擎类型

详细介绍该用法:这种语法适合所有的存储引擎,不过这里有一个“陷阱”:这种转换过程会消耗大量时间。MySQL为此要执行一个旧表到新表的逐行复制(Row-By-Row Copy)。在这期间,转换操作可能会占用服务器得所有I/O处理能力,并且在转换时,源表要被加读锁。因此,在一个繁忙的表上做此操作,要加以注意。作为替代手断,可以使用下面这个方法,它会先做个表拷贝。

如果从一个引擎到另一种引擎做表转换,所有属于原始引擎的专用特性都会丢失,例如,如果将一个innoDB表转换成MyISAM表,在转回来,那么最初定义在原InnoDB表上的所有外键都会丢失。


二:转储(Dump) 和导入(Import)

如果想对表转换的过程做更多控制,可以选择使用mysqldump工具,将表先转储(dump)成一个文本文件,在编辑转储文件(dump file),修改其中的CREATE TABLE语句。一定要注意修改表名和引擎类型,因为即便引擎类型有所不同,统一数据库种也不允许存在同一表名的两张表。另外,mysqldump在CREATE TABLE语句前,会默认地加上drop table 命令,如果不注意,可能因此丢失原有数据。


三:CREATE 和 SELECT

这种方法转换,在第一种方法的速度与第二种方法的安全性之间做了一个平衡。它不是转储整张表,或者一次性转换所有的数据,而是创建一个新表,使用MySQL的INSERT...SELECT语法来转移数据。如下:

mysql>CREATE TABLE innodb_table LIKE myisam_table;

mysql>ALTER TABLE innodb_table ENGINE=innoDB;

mysql>INSERT INTO innodb_table SELECT * FROM myisam_table;

如果数据数据量大,这种办法效果不错。但是更高效的办法是增量地填充表,在填充每个增量数据块的时候都提交事务,这样就不会导致撤销日志(Undo Log)变得过于庞大。假定id是主键,可以重复运行下列查询(每次逐次增大x和y的值),直至所有的数据都复制到新表。

mysql>START TRANSACTION;

mysql>INSERT INTO innodb_table SELECT * FROM myisam_table WHERE id BETWEEN x AND y;

mysql>COMMIT;

转移操作完成后,源表仍会保留,可以在操作完成后删除(drop)它,而此时,新表已经被填充完毕。注意:如有必要,请在转换时加锁源表,防止转移复制数据不一致的问题

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。