MySQL维护之存储引擎(表类型)
MySQL中的数据用各种不同的技术存储在文件(或内存)中。在MySQL架构原理之体系架构 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中可以看到其在MySQL中的第3层。
官方提供的存储引擎有:InnoDB/MyISAM等;第三方存储引擎中比较有名的有:TokuDB/XtraDB等。其中,最常见的两种存储引擎是MyISAM和InnoDB。通过show engines命令可以参考当前使用数据库支持的存储引擎。

关于InnoDB可以参考MySQL架构原理之存储引擎InnoDB存储结构 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com),本文主要介绍另一种常用的存储引擎MyISAM。
MyISAM存储引擎管理非事务表,提供高速缓存和减少,以及全文搜索能力。其存储组成如下:
每个MyISAM在磁盘上存储成3个文件。每个文件的名字就是表的名字,文件名与表名相同,扩展名指出了文件类型。需要注意的事,其不缓存数据文件,仅缓存索引文件,具体如下:
1、表定义的扩展名为.frm(frame,存储表定义)。
2、数据文件的扩展名.MYD(MYData,存储数据)。
3、索引文件的扩展名是.MYI(MYIndex,存储索引)。
数据文件和索引文件可以放置在不同的目录,平均分布I/O以获得更快的速度。同时其索引时压缩的,能加载更多索引——这样内存使用率就相应提供不少也节约了一些磁盘空间。
与InnoDB对比,它们的差异可以在下表中体现:

对于存储引擎如何进行批量更改呢?有如下方式:
1、使用M有SQL命令语句修改:altertable
alter table xxx engine=InnoDB|MyISAM|…
该方式简单适用于所有的引擎,同时其缺点也比较明显:
1)需要大量的I/O,因为MySQL需要执行从旧表到新表的一行一行的复制,效率及其低。
2)在转换期间源表加了读锁。
3)从一种引擎到另一种引擎做表转化,所有属于原始引擎的专用特性都会丢失。比如从InnoDB到MyISAM,InnoDB的索引都会丢失。
2、使用dump(转储),然后import(导入)
使用mysqldump这个工具将修改的数据导出后会以.sql的文件保存,可以对这个文件进行操作和更多的控制,比如修改表名、修改存储引擎等。
3、CREATESELECT
以上方式中,第一种方式简便,第二种方式安全。此种方式是以上两种方式的折中,过程如下示:
1)CREATE TABLE NEW_TABLE LIKE OLD_TABLE;
2)ALTER TABLE NEW_TABLE ENGINE=innodb|myisam|…;
3)INSERT INTO NEW_TABLE SELECT * FROM OLD_TABLE
4、使用sed对备份内容进行引擎转换
nohup sed -e 's/MyISAM/InnoDB/g' new....sql > new....sql
5、mysql_convert_table format 命令修改
mysql_convert_table format --host=‘…’ --uset='…' --password='…' --socket='…' --type='…'


浙公网安备 33010602011771号