MyISAM类型的表强调的是性能,其执行速度比InnoDB类型更快,但不提供事务支持,而InnoDB提供事务支持已及外部键等高级数据库功能。
1、MyISAM
每个MyISAM在磁盘存储成三个文件。文件以表名命名,以拓展名区分文件类型。
- .frm文件存储表定义。
- 数据文件的扩展名为.MYD (MYData)。
- 索引文件的扩展名是.MYI (MYIndex)。
MyISAM表格可以被压缩,而且他们支持全文搜索。不支持事务,而且不支持外键。如果事务回滚将会造成不完全回滚,不具备原子性。在进行update时,进行锁表并发量相对较小。如果执行大量的select,MyISAM是更好的选择。
MyISAM的索引和数据是分开的,并且索引式有压缩的,能加载更多索引,内存使用率就对应提高了不少。InnoDB是索引和数据紧密捆绑的,没有使用压缩从而造成InnoDB比MyISAM体积庞大不少。
MyISAM缓存在内存是索引,而不是数据。而InnoDB缓存在内存的是数据,相对来说,服务器内存越大,InnoDB发挥优势越大。
- 优点
查询速度较快,适合大量的select,支持全文索引 - 缺点
不支持事务,不支持外键,并发量较小,不适合大量update
2、InnoDB
这种类型是事务安全的。它支持外键。在update时表进行行锁,并发量相对较大。如果数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。
- 优点
支持事务,支持外键,并发量大,适合大量update - 缺点
查询数据相对较快,不适合大量的select
3、详细对比(补充两者差别)
一、InnoDB支持事务,MyISAM不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了。
二、MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用
三、InnoDB支持外键,MyISAM不支持
四、MyISAM是默认引擎,InnoDB需要指定
五、InnoDB不支持FULLTEXT类型的索引
六、InnoDB中不保存表的行数,如select count(*) from table
时,InnoDB需要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)
语句包含where
条件时MyISAM也需要扫描整个表
七、对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引
八、清空整个表时,InnoDB是一行一行的删除,效率非常慢。MyISAM则会重建表
九、InnoDB支持行锁(某些情况下还是锁整表,如 update table set a=1 where user like '%lee%')
参考文献:
1、MySQL存储引擎InnoDB与Myisam的六大区别