你的位置:首页 > 数据库

[数据库]什么是存储引擎以及不同存储引擎特点


  以前一直玩Oracle数据库,整天围着业务需求和执行计划转,刚刚接触Mysql看到存储引擎不慎理解,相应会有与我相同人群存在,所以写文以记之。

  

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

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

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

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

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

 

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