InnoDB与MyISAM总结和对比
Mysql的数据库引擎在我的博客中曾经有过陈述,但只是对所有引擎的一个简单叙述,而InnoDB与MyISAM数据库引擎是我们平时使用最多的,有必要进行详细全面的介绍和对比,以便我们在选择数据库引擎时能够根据需求更好地选择。
InnoDB
特点:
支持ACID事务(具有提交,回滚和崩溃恢复能力),支持存储过程,视图,支持行级锁定,支持外键,处理巨大数据量时拥有最大性能(可以说它的CPU效率是其他基于磁盘关系数据库引擎所不能匹敌的),表可以是任何尺寸,不支持全文类型的索引,插入缓冲、二次写、自适应哈希索引(三个特性详细介绍见: InnoDB的三个关键特性 (http://blog.csdn.net/z702143700/article/details/46049101)。
应用场景:
以INSERT、UPDATE为主的应用。 在需要高性能的大型数据库的应用中。 更新密集的表。InnoDB存储引擎特别适合处理多重并发的更新请求。 事务。InnoDB存储引擎是支持事务的标准MySQL存储引擎。 自动灾难恢复。与其它存储引擎不同,InnoDB表能够自动从灾难中恢复。 外键约束。MySQL支持外键的存储引擎只有InnoDB。 支持自动增加列AUTO_INCREMENT属性。注:InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”,select count(*) 、order by等也会锁表。而行级锁,一般只在涉及到索引的时候才会被使用。
比如:where条件中含索引字段时,就是行锁。其他情况都是表锁。
MyISAM
特点:
较高的查询速度,表级锁定;BLOB和TEXT列可以被索引;不支持事务,不支持外键;支持全文索引,支持3种不同的存储格式:静态(固定长度)表、动态表、压缩表;
静态表是默认的存储格式。静态表中的字段都是非变长字段,这样每个记录都是固定长度的,这种存储方式的优点是存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多。静态表在数据存储时会根据列定义的宽度定义补足空格,但是在访问的时候并不会得到这些空格,这些空格在返回给应用之前已经去掉。同时需要注意:在某些情况下可能需要返回字段后的空格,而使用这种格式时后面到空格会被自动处理掉。
动态表包含变长字段,记录不是固定长度的,这样存储的优点是占用空间较少,但是频繁到更新删除记录会产生碎片,需要定期执行OPTIMIZE TABLE语句或myisamchk -r命令来改善性能,并且出现故障的时候恢复相对比较困难。
压缩表由myisamchk工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只有非常小的访问开支。
应用场景:
对事务完整性没有要求或者以SELECT为主的应用。 无事务要求,但对效率要求比较高的应用。注:NULL值被允许在索引的列中,这个占每个键的0-1个字节。