MyISAM不支持事务、也不支持外键,其优势是访问的速度快,对事务完整性没有要求或者以SELECT、INSERT为主的应用基本上都可以使用这个引擎来创建表。
InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。对比MyISAM,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。
MySQL数据库中最重要的两个存储引擎InnoDB与MyISAM。
特别重要的区别:
- 事务性
InnoDB支持事务,MyISAM不支持。 - 外键约束
InnoDB支持外键,MyISAM不支持。 - 加锁与并发
InnoDB支持行锁和表锁,MyISAM只支持表锁。关于MySQL的锁,可参考MySQL InnoDB的锁。 - 索引
InnoDB支持聚簇索引,数据和索引聚集在一起。MyISAM不支持聚簇索引,数据和索引是分开存储的。
其他的区别:
- COUNT()函数
关于MyISAM有这样一个误解,就是执行COUNT()函数会非常快。这个论断需要有一个前提条件,没有任何WHERE条件的COUNT(*)才非常快。因为MyISAM用一个变量保存了表的行数,当没有WHERE条件时可以直接读取这个值即可。而如果存在WHERE条件时,MyISAM没有任何优势,比起InnoDB可能慢,也可能快。 - 主键
因为InnoDB支持聚簇索引,必须要有主键,详情可参考MySQL的聚簇索引和覆盖索引,MyISAM可以没有主键。 - 压缩
可以使用myisampack对MyISAM表进行压缩,压缩后的表不可以被修改(除非先解压、再修改、再压缩)。压缩表可以极大地减少磁盘空间占用,因此可以减少磁盘IO,从而提升查询性能。压缩表也支持索引,但索引是只读的。压缩时表中记录是独立的,所以读取单行时不需要解压整个表。 - 存储
- InnoDB引擎存储:
- 共享表空间存储,表结构保存在.frm文件中,数据和索引保存在innodb_data_home_dir和innodb_data_file_path定义的表空间中,可以是多个文件。
- 多表空间存储,表结构仍然保存在.frm文件中,但是每个表的数据和索引单独保存在.ibd中。
- MyISAM引擎:
- .frm文件,存储表定义
- .MYD文件,MYData,存储数据
- .MYI文件,MYIndex,存储索引
网友评论