MySQL存储引擎介绍


MySql数据库最大的特点就是其插件式的存储引擎架构,本文主要介绍MySql经常使用的存储引擎,为开发时选择合适的存储引擎提供参考。算法


1. MySql体系结构

在介绍存储引擎以前先来介绍下MySql的体系结构,以便你们知道存储引擎在MySql整个体系中处于什么位置。下图是官方提供的一张架构图:sql

MySQL架构
MySQL体系结构图数据库

从上图能够发现,MySQL由如下几部分组成:缓存

  • 链接池组件
  • 管理服务和工具组件
  • SQL接口组件
  • 查询分析器组件
  • 优化器组件
  • 缓冲(Cache)组件
  • 插件式存储引擎
  • 物理文件

MySQL数据库区别于其余数据库的最重要的一个特色就是其插件式的表存储引擎,从上图中也能够看到,MySql支持不少种存储引擎。须要特别注意的是,存储引擎是基于表的,而不是数据库。安全

2. MySql存储引擎

插件式存储引擎的好处是:可以根据具体的应用的特色选择不一样的存储引擎。下面是几种MySQL经常使用的存储引擎。架构

2.1 InnoDB存储引擎

InnoDB存储引擎支持事务,其设计目标主要面向在线事务处理(OLTP)的应用。其特色是行锁设计、支持外键,并支持相似于Oracle的非锁定读,即默认读取操做不会产生锁。从MySQL数据库5.5.8版本开始,InnoDB存储引擎是默认的存储引擎。并发

InnoDB经过使用多版本并发控制(MVCC)来得到高并发性,而且实现了SQL标准的4种隔离级别,默认为REPEATABLE级别。同时,使用一种被称为next-key locking的策略来避免幻读(phantom)现象的产生。除此以外,InnoDB储存引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead)等高性能和高可用的功能。高并发

对于表中数据的存储,InnoDB存储引擎采用了汇集(clustered)的方式,所以每张表的存储都是按主键的顺序进行存放。若是没有显式地在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID,并以此做为主键。工具

2.2 MyISAM存储引擎

MyISAM存储引擎不支持事务、表锁设计,支持全文索引,主要面向一些OLAP数据库应用。此外,MyISAM存储引擎的另外一个不同凡响的地方是它的缓冲池只缓存(cache)索引文件,而不缓冲数据文件,这点和大多数的数据库都很是不一样。从MySQL 5.0版本开始,MyISAM默认支持256TB的单表数据,这足够知足通常应用需求。

2.3 Memory存储引擎

Memory存储引擎(以前称HEAP存储引擎)将表中的数据存放在内存中,若是数据库重启或发生崩溃,表中的数据都将消失。它很是适合用于存储临时数据的临时表,以及数据仓库中的纬度表。Memory存储引擎默认使用哈希索引,而不是咱们熟悉的B+树索引。

虽然Memory存储引擎速度很是快,但在使用上仍是有必定的限制。好比,只支持表锁,并发性能较差,而且不支持TEXT和BLOB列类型。最重要的是,存储变长字段(varchar)时是按照定常字段(char)的方式进行的,所以会浪费内存。

此外有一点容易被忽视,MySQL数据库使用Memory存储引擎做为临时表来存放查询的中间结果集(intermediate result)。若是中间结果集大于Memory存储引擎表的容量设置,又或者中间结果含有TEXT或BLOB列类型字段,则MySQL数据库会把其转换到MyISAM存储引擎表而存放到磁盘中。以前提到MyISAM不缓存数据文件,所以这时产生的临时表的性能对于查询会有损失。

2.4 Archive存储引擎

Archive存储引擎只支持INSERT和SELECT操做,从MySQL 5.1开始支持索引。Archive存储引擎使用zlib算法将数据行(row)进行压缩后存储,压缩比通常可达1∶10。正如其名字所示,Archive存储引擎很是适合存储归档数据,如日志信息。Archive存储引擎使用行锁来实现高并发的插入操做,可是其自己并非事务安全的存储引擎,其设计目标主要是提供高速的插入和压缩功能。

固然MySql还支持不少其余的存储引擎,这边不一一列举了。

3. 存储引擎对比整理

存储引擎能够理解为表的存储结构,每种存储引擎都支持不一样的特性。MySQL支持插件式的存储引擎,能够为每张数据表指定不一样的存储引擎。经常使用的存储引擎的特色总体以下:

咱们也可使用下面命令查看当前数据库支持哪些存储引擎:

-- 查看支持的存储引擎
show engines;

下面对最经常使用的三种存储引擎作下简单总结介绍:

  • InnoDB:MySQL默认的存储引擎,支持事务、支持行级锁和表级锁、支持各种索引、支持外键,高版本的MySQL还支持全文索引,可是批量数据插入的效率较低;
  • MyISAM:具备较高的数据插入效率和数据查询速度,支持全文索引,可是不支持数据库事务,不支持行级锁,只支持表级锁;
  • MEMORY:使用这个存储引擎时,会将表中的数据加载到内存中,查询很快,可是对内存要求较高。

因此咱们应该根据应用的具体需求选择合适的存储引擎,而不是不加思考的都选择默认存储引擎(INNODB)。

若是要提供提交、回滚和恢复的事务安全(ACID兼容)能力,并要求实现并发控制,InnoDB是一个很好的选择。若是数据表主要用来插入和查询记录,则MyISAM引擎提供较高的处理效率。若是只是临时存放数据,数据量不大,而且不须要较高的数据安全性,能够选择将数据保存在内存的MEMORY引擎中,MySQL中使用该引擎做为临时表,存放查询的中间结果。若是只有INSERT和SELECT操做,能够选择Archive引擎,Archive存储引擎支持高并发的插入操做,可是自己并非事务安全的。Archive存储引擎很是适合存储归档数据,如记录日志信息可使用Archive引擎。

4. 参考

  • 《MySQL技术内幕》
相关文章
相关标签/搜索