MySQL 架构 - MySQL 存储引擎 -表的转换

表的转换

有许多方法可以把表从一个引擎转换为另一个。每种多有优点和缺点。在这节中,将介绍三种方法。

 

ALTER TABLE

ALTER TABLE是最简单的转换引擎的方法。下列语句是把mytable表转换为Falcon引擎:

mysql> ALTER TABLE mytable ENGINE = Falcon;

 

这个语法适用于所有存储引擎,但是有点要注意:这种方式会消耗许多时间。MySQL从旧表中把一行一行的数据复制到新表中。这段时间内,这个操作会用到所有的I/O读写,以及转换的过程中,原始表将会加上个读锁。因此,在一个频繁操作的表使用这个方法之前,尤其要小心。替代方法就是,你可以使用下面将说到的方法。这个方法就是首先要复制这张表。

 

当你转换引擎的时候,存储引擎的特性都会失效。如,如果你把InnoDB的表转换为MyISAM以及又恢复到InnoDB,你会丢失先前InnoDB表所定义的外键。

 

Dump and import

为了更好的控制转换过程,你可能会使用mysqldump把表导出为一个文本文件。一旦你导出这张表,你就可以简单的修改CREATE TABLE语句。要确定改变表名以及它的类型,因为不能在同一个数据库中包含相同名称的表,即使它们的引擎类型各不相同。还有就是mysqldump默认的把DROP TABLE命令写在CREATE 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;

 

在没有太多数据的情况下,这种方法可以很好的工作。但是如果你要这么做,更有效的方法是增量式插入,可以把数据分成块进行事物提交,因此这样做可以使撤销日志记录不会变得太大。假设id是主键,重复的运行这些语句(每次都加大x和y的值)直到把所有数据都复制到新表中。

 

mysql> CREATE TABLE innodb_table LIKE myisam_table;

mysql> ALTER TABLE innodb_table ENGINE=InnoDB;

mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;

 

这样做之后,还剩两张表,一张是原始表,这个表使用完,你可以把它删除。另外一个完全填充完的新表。如果要保持两张表一致,要小心的锁定原始表。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值