什么是存储引擎以及不同存储引擎特点

 以前一直玩Oracle数据库,整天围着业务需求和执行计划转,最近看面试题,看到存储引擎这个名词,不慎理解,在网上找了几篇文章记录下来。

  

  首先简单从字面理解,想当是与磁盘打交道的,实际情况也是如此。一个数据库系统可以随意切换不同的存储引擎,也就是说随意选择写磁盘或操作磁盘的方式,觉得还是很牛掰的,所以这里看下Mysql的体系结构。

  MySQL服务器采用了多层设计和独立模块,插件式存储引擎体系结构,允许将存储引擎加载到正在运新的MySQL服务器中,图中的Pluggable Storage Engines部分。采用MySQL服务器体系结构,由于在存储级别上(也就是Pluggable Storage Engines)提供了一致和简单的应用模型和API,应用程序编程人员和DBA可不再考虑所有的底层实施细节。因此,尽管不同的存储引擎具有不同的能力,应用程序是与之分离的。存储引擎就司职与文件系统打交道了。

  到这里对与存储引擎的定位以及功能应该是基本了解的,接下来的疑问就是,有没有必要。很有必要的,因为一下罗列的内容是存储引擎处理的事情:

  • 并发性:某些应用程序比其他应用程序具有很多的颗粒级锁定要求(如行级锁定)。
  • 事务支持:并非所有的应用程序都需要事务,但对的确需要事务的应用程序来说,有着定义良好的需求,如ACID兼容等。
  • 引用完整性:通过DDL定义的 外键,服务器需要强制保持关联数据库的引用完整性。
  • 物理存储:它包括各种各样的事项,从表和索引的总的页大小,到存储数据所需的格式,到物理磁盘。
  • 索引支持:不同的应用程序倾向于采用不同的索引策略,每种存储引擎通常有自己的编制索引方法,但某些索引方法(如B-tree索引)对几乎所有的存储引擎来说是共同的。
  • 内存高速缓冲:与其他应用程序相比,不同的应用程序对某些内存高速缓冲策略的响应更好,因此,尽管某些内存高速缓冲对所有存储引擎来说是共同的(如用于用户连接的高速缓冲,MySQL的高速查询高速缓冲等),其他高速缓冲策略仅当使用特殊的存储引擎时才唯一定义。
  • 性能帮助:包括针对并行操作的多I/O线程,线程并发性,数据库检查点,成批插入处理等。
  • 其他目标特性:可能包括对地理空间操作的支持,对特定数据处理操作的安全限制等。

以上要求会在不同的需求中予以体现,通过单独一个系统实现是不可能的,以上特点有些本身就是相互矛盾的,鱼和熊掌的问题。对以上内容做些选择,形成的存储引擎就是一个插件引擎了,某些特定的需求可以使用。如下图,部分现有的存储引擎以及基本特点:

 

  至此,应该对存储引擎有一个直观的印象了。对了,还有一点需要格外注意的: Mysql中不同的表可以指定不同的存储引擎,也就是说一套Mysql服务器可以同时使用N种不同的存储引擎,甚至自己写一个。


下面我们重点介绍几种常用的存储引擎并对比各个存储引擎之间的区别和推荐使用方式。

特点 Myisam BDB Memory InnoDB Archive
存储限制没有没有64TB没有
事务安全 支持 支持 
锁机制表锁页锁表锁行锁行锁
B树索引支持支持支持支持 
哈希索引  支持支持 
全文索引支持    
集群索引   支持 
数据缓存  支持支持 
索引缓存支持 支持支持 
数据可压缩支持   支持
空间使用N/A非常低
内存使用中等
批量插入的速度非常高
支持外键   支持 

最常使用的2种存储引擎:

  • Myisam是Mysql的默认存储引擎。当create创建新表时,未指定新表的存储引擎时,默认使用Myisam。每个MyISAM在磁盘上存储成三个文件。文件名都和表名相同,扩展名分别是.frm(存储表定义)、.MYD (MYData,存储数据)、.MYI (MYIndex,存储索引)。数据文件和索引文件可以放置在不同的目录,平均分布io,获得更快的速度。   
  • InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比Myisam的存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。

如何选择合适的存储引擎

选择标准:根据应用特点选择合适的存储引擎,对于复杂的应用系统可以根据实际情况选择多种存储引擎进行组合。

下面是常用存储引擎的适用环境:
  1. MyISAM:默认的MySQL插件式存储引擎,它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一
  2. InnoDB:用于事务处理应用程序,具有众多特性,包括ACID事务支持。
  3. Memory:将所有数据保存在RAM中,在需要快速查找引用和其他类似数据的环境下,可提供极快的访问。
  4. Merge:允许MySQL DBA或开发人员将一系列等同的MyISAM表以逻辑方式组合在一起,并作为1个对象引用它们。对于诸如数据仓储等VLDB环境十分适合。

参考文章:http://www.cnblogs.com/wildfox/p/5815414.html



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值