截止目前,Myslq一共向用户提供了包括DBD,HEAP,ISAM,MERFE,MyISAM,InnoDB以及Gemeni这7种Mysql表类型,其中DBD,InnoDB属于事物安全类表,而其他属于事物非安全类表。
BDB
Berkeley Db(BDB)表是支持事物处理的表,由Sleepycat软件公司开发。它提供Mysql用户期待已久的功能--事物控制。事物控制在任何数据库系统中国呢都是一个极有价值的功能,因为它们确保一组命令能成功地执行和回滚。
HEAP
HEAP表是MySQL中存取数据最快的表。这是因为他们使用存储在动态内存中的一个散列索引,不过如果MySQL或服务器崩溃,这些内存数据将会丢失。
ISAM
ISAM表是早期MySQL版本的缺省表类型,知道MyISAM开发出来。建议不要再使用它。
MERGE
MERGE是一个有趣的新类型,在3.23.25之后出现。一个MERGE表实际上又一个MyISAM表的集合,合并而成的一个表,主要是为了效率的考虑,因为这样不仅仅可以提高速度,搜索效率,修复效率而且还节省了磁盘空间。
MyISAM
MyISAM基于ISAM代码,可以说是ISAM的衍生品,不过增加了不少好用的扩展。它是MySQL的默认数据表类型,基于了传统的ISAM类型,ISAM是Indexed Sequential Access Method(有索引的顺序访问方法)的缩写,一般来说,它是存储记录和文件的标准方法。与其他存储引擎相比,MyISAM具有检查和修复表格的大多数工具。ISAM表格可以被压缩,而且它们支持全文索引,不过它们不是事物安全的,也不支持外健。如果事物会滚将会造成不完全会滚,从而不具备原子性。假如忽略事物以及访问并发性的话,并且需要执行大量的select检索语句的话,MyISAM将是最好的选择。
InnoDB
InnoDB是MySQL4.0之后推出的一种比较新的数据表类型,这种类型是事物安全的。它与BDB类型具有相同的特性,它们还支持外健。InnoDB表格速度很快具有比BDB还丰富的特性,因此如果需要一个事物安全的存储引擎,建议使用它。如果你的数据执行大量的insert或者update,处于性能方面的考虑,同样应该使用InnoDb表。对于支持事物的InnoDB类型的表来说,影响速度的主要原因是autcommit设置是打开的,而且程序没有显式调用begin开始事物,导致每插入一条都自动提交,严重影响了速度。可以在执行sql前调用begin,多条sql想成一个事物,将大大提高性能。
Gemeni
Gemeni表,据说是在Mysql 4.0之后推出的,不过截止当前,很少有针对它的介绍,同样应用也就更少了,我们暂时不做介绍。
MySQL的数据类型很多,其中比较重要的是MyISAM,InnoDB这两种。
InnoDB和MyISAM的区别与应用场景。
1.区别:
(1)事物处理:
MyISAM是非事物安全型的,而InnoDB是事物安全型的(支持事物处理等高级处理);
(2)锁机制不同:
MyISAM是表级锁,而InnoDB是行级锁。
(3)select,update,insert,delete操作:
MyISAM:如果执行大量的select,MyISAM是更好的选择
InnoDB:如果你的数据执行大量的insert或update,出于性能方面的考虑,应该使用InnoDB
(4)查询表的行数不同:
MyISAM:select count(*) from table,MyISAM只是简单的读出保存好的行数,注意的是,当count(*)语句包含where条件时,两种表的操作是一样的。
InnoDB:InnoDB中不保存表的具体行数,也就是说,执行select count(*)from table时,InnoDB要扫描一遍整个表来计算有多少行
(5)外健支持:
MyISAM表不支持外健,而InnoDB支持
2.为什么MyISAM会比InnoDB的查询速度快?
InnoDB在做select的时候,要维护的东西比MyISAM引擎多很多;
1)数据块,InnoDB要缓慢,MyISAM只缓存索引快,这中间还有换进换出的减少;
2)InnoDB寻址要映射到块,再到行,MyISAM记录的直接是文件的offset,定位比InnoDB要快
3)InnoDB还需要维护MVCC一致;虽然你的场景没有,但他还是需要去检查和维护
MVCC(Muti-Version Concurrency Control)多版本并发控制
3.应用场景
MyISAM适合:(1)做很多count的计算;(2)插入不频繁,查询非常频繁;(3)没有事务。
InnoDB适合:(1)可靠性要求比较高,或者要求事物;(2)表更新和查询都相当频繁,并且行锁定的机会比较大的情况。