MySQL存储引擎选择和比较

本文介绍了MySQL的7种存储引擎,包括MyISAM、HEAP、Archive、Merge、InnoDB、NDB及其各自的适用场景。此外,还详细对比了MyISAM和InnoDB之间的主要区别,帮助读者更好地理解如何根据实际需求选择合适的存储引擎。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的复制只读集群。

对于写操作很多的应用, 基于InnoDBactive/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的性能优势.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值