MYSQL的引擎不是一般的多, 共有7种存储引擎。
每一种引擎都是完全不同的, 都是为了满足特定应用的需要。
你可已选择最适合的引擎而不是向oracle里头只有一种通用的存储引擎。
引擎介绍:
Ø MyISAM: 默认的存储引擎, 不支持事务机制,数据可靠性中等, 表级锁。在读操作占多数的应用中有很好的性能, 大部分web和数据库存服务都用了MyISAM. MyISAM强调了快速读取操作, 它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源
Ø HEAP: 数据都在内存中, 读取速度很快, 然而它所管理的数据是不稳定的, 一旦宕机则所有数据丢失, 很适合于小规模的临时表。HEAP表格在你需要使用SELECT表达式来选择和操控数据的时候非常有用。要记住,在用完表格之后就删除表格。让我再重复一遍:在你用完表格之后,不要忘记删除表格。
Ø Archive: 用于存储无索引的大量数据
Ø Merge: 允许你把许多结构相同的表合并为一个表。然后,你可以执行查询,从多个表返回的结果就像从一个表返回的结果一样。每一个合并的表必须有同样的表定义。
你只能合并MyISAM表而且必须严格遵守相同的表定义的限制。
Ø InnoDB: 支持事务机制, 由于有行级锁适合于写操作很多的应用, 有很好的数据恢复功能和可靠性。
Ø NDB: 基于集群的引擎-数据被自动切分并复制到数个机器上(数据节点), 适合于那些需要极高查询性能和高可用性的应用, 原来是为爱立信的电信应用设计的。 NDB提供了高达99.999%的可靠性,在读操作多的应用中表现优异。 对于有很多并发写操作的应用, 还是推荐用InnoDB.
NDB最大的缺点是它的设计是要求内存能容纳整个数据库, 如果你的数据库占用的空间太大, 那NDBCluster就不适合你。
以下是一些例子为不同的应用挑选了最佳的存储引擎:
搜索引擎---NDBCluster
金融事务---InnoDB
会话数据(Session data)--- MyISAM or NDBCluster
本地化计算(Localized calculations) - HEAP
字典索引---MyISAM
可扩展性:
成功的web应用最终都会遇到系统容量的限制, 你有2个办法来提供系统容量:复制或者NDB集群,选择哪个方法总是依赖于你的应用需要。
对于读操作很多的应用, 使用NDB集群或者配置基于MyISAM的复制只读集群。
对于写操作很多的应用, 基于InnoDB的active/passive复制是最好的选择。 你也许想试下NDB集群,NDB集群会比InnoDB性能差很多, 但是提供了更好的可用性.
其原文地址为《MySQL Storage Engines》。
Ps: 你还可以通过使用64位处理器来获取额外的一些性能。据说因为MySQL在内部里很多时候都使用64位的整数处理。
MySQL: MyISAM和InnoDB的区别
InnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用 而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB 类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。
移值性:
MyISAM类型的二进制数据文件可以在不同操作系统中迁移。也就是可以直接从Windows系统拷贝到linux系统中使用。
MyIASM是IASM表的新版本,有如下扩展:
二进制层次的可移植性。
NULL列索引。
对变长行比ISAM表有更少的碎片。
支持大文件。
更好的索引压缩。
更好的键吗统计分布。
更好和更快的auto_increment处理。
支持全文搜索,不过它们是事务不安全的,而且也不支持外键。如果事务回滚将会造成不完全回滚,从而不具备原子性。
读锁和写锁是互斥的,从而读写操作是串行的,MyISAM表不太适合于有大量更新操作和查询操作应用的原 因。因为,大量的更新操作会造成查询操作很难获得读锁,从而可能永远阻塞。
数据行锁定: 不支持,只有表锁定
以下是一些细节和具体实现的差别:
1.InnoDB不支持FULLTEXT类型的索引。
2.InnoDB中不保存表的 具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。
3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,同样应该使用InnoDB表。
对于支持事务的InnoDB类型的表来说,影响速度的主要原因是AUTOCOMMIT默认设置是打开的,而且程序没有显式调用BEGIN 开始事务,导致每插入一条都自动提交,严重影响了速度。可以在执行sql前调用begin,多条sql形成一个事物(即使autocommit打开也可以),将大大提高性能。
查看autocommit:select @@autocommit;
设置autocommit:set autocommit=0;
MyISAM和InnoDB存储引擎性能差别并不是很大,针对InnoDB来说,影响性能的主要是 innodb_flush_log_at_trx_commit 这个选项,如果设置为1的话,那么每次插入数据的时候都会自动提交,导致性能急剧下降,应该是跟刷新日志有关系,设置为0效率能够看到明显提升,当然,同样你可以SQL中提交“SET AUTOCOMMIT = 0”来设置达到好的性能。
另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”
任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势.