码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2015-06-08 15:04:16      阅读:149      评论:0      收藏:0      [点我收藏+]

标签: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)它,而此时,新表已经被填充完毕。注意:如有必要,请在转换时加锁源表,防止转移复制数据不一致的问题

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

标签:mysql 转换修改表存储引擎 详细介绍

原文地址:http://blog.csdn.net/leyangjun/article/details/46410767

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!