1.MyISAM
(1)MySQL 5.5之前的默认存储引擎,不支持事务,不支持外键,优势是访问速度快。
(2)每个MyISAM在磁盘上存储成三个文件。文件名都和表名相同,扩展名指出文件类型。
- .frm文件存储表定义。
- 数据文件的扩展名为.MYD (MYData)。
- 索引文件的扩展名是.MYI (MYIndex)。
数据文件和索引文件可以放置在不同的目录,平均分布IO,获得更快的速度。
(3)支持3种不同的存储格式
- 静态表(固定长度):每个记录都是固定长度,存储时按照列的宽度定义补齐,应用访问时,返回给应用的空格会去掉。优点:存储迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态多。
- 动态表:表中包含变长字段。优点:占用空间相对较少;缺点:频繁地更新和删除记录会产生碎片,需要定期执行OPTIMIZE TABLE语句或者myisamchk-r命令来改善性能。
- 压缩表:由myisampack工具创建,占据非常小的磁盘空间。因为每个记录被单独压缩,所以访问开支非常小。
2.InnoDB
(1)MySQL 5.5之后默认存储引擎。具有提交、回滚和崩溃恢复能力的事务安全,但是和MyISAM相比,写的处理效果较差,并且会占用更多的磁盘空间以保存数据和索引。
(2)自动增长列
- InnoDB:InnoDB中必须包含只有该字段的索引。引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列。
- MyISAM:可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增。
(3)只有InnoDB支持外键。在创建外键时,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。
(4)存储方式有两种:
- 使用共享表空间存储:这种方式创建的表的表结构保存在.frm文件中,数据和索引保存在innodb_data_home_dir和innodb_data_file_path定义的表空间中,可以是多个文件。
- 使用多表空间存储:这种方式创建的表的表结构保存在.frm文件中,但是每个表的数据和索引单独保存在.ibd中。如果是个分区表,则每个分区对应单独的.idb文件,文件名是“表名+分区名”,可以在创建分区的时候指定每个分区的数据文件位置,以此来将表的IO均匀分布在多个磁盘上。多表空间的参数生效后,只对新建的表生效。
3.适用环境
- MyISAM:应用以读操作和插入为主,很少更新和删除,并且对事务的完整性和并发性要求不高,选择MyISAM。MyISAM是在Web、数据仓库等应用环境下最常用的存储引擎之一。
- InnoDB:如果应用程序对事务的完整性有较高的要求,在并发条件下要求数据的一致性,数据除了插入和查询外,还包括很多的更新、删除操作,InnoDB比较合适。InnoDB可以有效降低由于删除和更新导致的锁定,还可以确保事务的完整提交和回滚,对于计费系统或者财务系统等对数据准确性要求比较高的系统,InnoDB都是合适的选择。
参考《深入浅出MySQL》