Mysql存储引擎:InnoDB和MyISAM存储引擎(Mysql并不只有这两个存储引擎,只是两个引擎使用率比较高)
InnoDB存储引擎:
InnoDB是Mysql默认事务类引擎,是最重要最广泛的存储引擎。他被设计处理大量的短期事务。它的性能和自动崩溃修复特性使得在很多非事务存储的需求中也很流行。除非有特殊的原因需要使用其他存储引擎,否则优先考虑InnoDB引擎。
InnoDB采用MVCC来支持高并发,并且实现了四个标准的隔离级别。其默认级别是REPEATABLE_READ(可重复读)。
InnoDB表是基于聚簇索引建立的。聚簇索引对主键查询有很高的性能。不过它的二级索引(非主键索引)中必须包含主键列,所以如果主键列很大的话,其他的所有索引都会很大。所以,若表上的索引较多的话,主键应尽可能的小。
MyISAM存储引擎:
在Mysql5.1及以前版本,MyISAM是默认的存储引擎。MyISAM提供了大量的特性,全文检索、压缩、空间函数(GIS),但MyISAM不支持事务和行级锁,而且崩溃后无法安全恢复。
转换表引擎:
-
1、 alter table
alter table mytable engine=InnoDB;
适用于所有引擎,不过原理是将数据从原表复制到一个新的表里,在复制期间可能会消耗所有系统的I/O能力,同时会在原表上加锁。所以在繁忙的表中不适合此类操作。
-
2、 导入与导出
可以使用masqldump工具将数据导出到文件,然后修改文件中的create table语句的存储引擎选项,再修改表名。同时要注意mysqldump默认会自动在create table语句前面加上drop table语句,不注意这一点可能会造成数据丢失。
-
3、 查询与创建
Create table innodb_table like myisam_table;
Alter table innodb_table Engine=InnoDB;
Insert into innodb_table select * from myisam_table;
新建一个与原表一样数据结构的表,然后改变表的存储引擎,然后添加数据。
如果数据量大的情况下,应考虑分批处理,针对每一段数据执行事务提交操作,避免大事务产生过多的undo。假设有主键字段id,重复运行一下语句(最小值x和最大值y进行相应的替换)将数据导入到新表中。
Start transaction;
Insert in innodb_table select * from myisam_table where id between X and Y;
Commit;
注:可以使用pt-onlne-schema-change的工具(基于Facebook的在心schema变更技术),可以比较简单、方便地执行上述过程,避免手工操作可能导致的失误和繁琐。