mysql存储引擎

mysql中的存储引擎

 

mysql存储引擎概述

什么是存储引擎?

MySQL中的数据用各类不一样的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不一样的存储机制、索引技巧、锁定水平而且最终提供普遍的不一样的功能和能力。经过选择不一样的技术,你可以得到额外的速度或者功能,从而改善你的应用的总体功能。html

例如,若是你在研究大量的临时数据,你也许须要使用内存存储引擎。内存存储引擎可以在内存中存储全部的表格数据。又或者,你也许须要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力)。mysql

这些不一样的技术以及配套的相关功能在MySQL中被称做存储引擎(也称做表类型)。 sql

MySQL默认配置了许多不一样的存储引擎,能够预先设置或者在MySQL服务器中启用。你能够选择适用于服务器、数据库和表格的存储引擎,以便在选择如何存储你的信息、如何检索这些信息以及你须要你的数据结合什么性能和功能的时候为你提供最大的灵活性。数据库

选择如何存储和检索你的数据的这种灵活性是MySQL为何如此受欢迎的主要缘由。其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储编程

遗憾的是,其它类型的数据库解决方案采起的“一个尺码知足一切需求”的方式意味着你要么就牺牲一些性能,要么你就用几个小时甚至几天的时间详细调整你的数据库。使用MySQL,咱们仅须要修改咱们使用的存储引擎就能够了缓存

mysql支持哪些存储引擎?

  mysql5.6支持的存储引擎包括InnoDB、MyISAM、MEMORY、CSV、BLACKHOLE、FEDERATED、MRG_MYISAM、ARCHIVE、PERFORMANCE_SCHEMA。其中NDB和InnoDB提供事务安全表,其余存储引擎都是非事务安全表。安全

各类存储引擎的特性

概览

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

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

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

 

InnoDB

MySql 5.6 版本默认的存储引擎。InnoDB 是一个事务安全的存储引擎,它具有提交、回滚以及崩溃恢复的功能以保护用户数据。InnoDB 的行级别锁定以及 Oracle 风格的一致性无锁读提高了它的多用户并发数以及性能。InnoDB 将用户数据存储在汇集索引中以减小基于主键的普通查询所带来的 I/O 开销。为了保证数据的完整性,InnoDB 还支持外键约束。

MyISAM

MyISAM既不支持事务、也不支持外键、其优点是访问速度快,可是表级别的锁定限制了它在读写负载方面的性能,所以它常常应用于只读或者以读为主的数据场景。

Memory

在内存中存储全部数据,应用于对非关键数据由快速查找的场景。Memory类型的表访问数据很是快,由于它的数据是存放在内存中的,而且默认使用HASH索引,可是一旦服务关闭,表中的数据就会丢失

BLACKHOLE

黑洞存储引擎,相似于 Unix 的 /dev/null,Archive 只接收但却并不保存数据。对这种引擎的表的查询经常返回一个空集。这种表能够应用于 DML 语句须要发送到从服务器,但主服务器并不会保留这种数据的备份的主从配置中。

CSV

它的表真的是以逗号分隔的文本文件。CSV 表容许你以 CSV 格式导入导出数据,以相同的读和写的格式和脚本和应用交互数据。因为 CSV 表没有索引,你最好是在普通操做中将数据放在 InnoDB 表里,只有在导入或导出阶段使用一下 CSV 表。

NDB

(又名 NDBCLUSTER)——这种集群数据引擎尤为适合于须要最高程度的正常运行时间和可用性的应用。注意:NDB 存储引擎在标准 MySql 5.6 版本里并不被支持。目前可以支持

MySql 集群的版本有:基于 MySql 5.1 的 MySQL Cluster NDB 7.1;基于 MySql 5.5 的 MySQL Cluster NDB 7.2;基于 MySql 5.6 的 MySQL Cluster NDB 7.3。一样基于 MySql 5.6 的 MySQL Cluster NDB 7.4 目前正处于研发阶段。

Merge

容许 MySql DBA 或开发者将一系列相同的 MyISAM 表进行分组,并把它们做为一个对象进行引用。适用于超大规模数据场景,如数据仓库。

Federated

提供了从多个物理机上联接不一样的 MySql 服务器来建立一个逻辑数据库的能力。适用于分布式或者数据市场的场景。

Example

这种存储引擎用以保存阐明如何开始写新的存储引擎的 MySql 源码的例子。它主要针对于有兴趣的开发人员。这种存储引擎就是一个啥事也不作的 "存根"。你可使用这种引擎建立表,可是你没法向其保存任何数据,也没法从它们检索任何索引。
复制代码
InnoDB

MySql 5.6 版本默认的存储引擎。InnoDB 是一个事务安全的存储引擎,它具有提交、回滚以及崩溃恢复的功能以保护用户数据。InnoDB 的行级别锁定以及 Oracle 风格的一致性无锁读提高了它的多用户并发数以及性能。InnoDB 将用户数据存储在汇集索引中以减小基于主键的普通查询所带来的 I/O 开销。为了保证数据的完整性,InnoDB 还支持外键约束。

MyISAM

MyISAM既不支持事务、也不支持外键、其优点是访问速度快,可是表级别的锁定限制了它在读写负载方面的性能,所以它常常应用于只读或者以读为主的数据场景。

Memory

在内存中存储全部数据,应用于对非关键数据由快速查找的场景。Memory类型的表访问数据很是快,由于它的数据是存放在内存中的,而且默认使用HASH索引,可是一旦服务关闭,表中的数据就会丢失

BLACKHOLE

黑洞存储引擎,相似于 Unix 的 /dev/null,Archive 只接收但却并不保存数据。对这种引擎的表的查询经常返回一个空集。这种表能够应用于 DML 语句须要发送到从服务器,但主服务器并不会保留这种数据的备份的主从配置中。

CSV

它的表真的是以逗号分隔的文本文件。CSV 表容许你以 CSV 格式导入导出数据,以相同的读和写的格式和脚本和应用交互数据。因为 CSV 表没有索引,你最好是在普通操做中将数据放在 InnoDB 表里,只有在导入或导出阶段使用一下 CSV 表。

NDB

(又名 NDBCLUSTER)——这种集群数据引擎尤为适合于须要最高程度的正常运行时间和可用性的应用。注意:NDB 存储引擎在标准 MySql 5.6 版本里并不被支持。目前可以支持

MySql 集群的版本有:基于 MySql 5.1 的 MySQL Cluster NDB 7.1;基于 MySql 5.5 的 MySQL Cluster NDB 7.2;基于 MySql 5.6 的 MySQL Cluster NDB 7.3。一样基于 MySql 5.6 的 MySQL Cluster NDB 7.4 目前正处于研发阶段。

Merge

容许 MySql DBA 或开发者将一系列相同的 MyISAM 表进行分组,并把它们做为一个对象进行引用。适用于超大规模数据场景,如数据仓库。

Federated

提供了从多个物理机上联接不一样的 MySql 服务器来建立一个逻辑数据库的能力。适用于分布式或者数据市场的场景。

Example

这种存储引擎用以保存阐明如何开始写新的存储引擎的 MySql 源码的例子。它主要针对于有兴趣的开发人员。这种存储引擎就是一个啥事也不作的 "存根"。你可使用这种引擎建立表,可是你没法向其保存任何数据,也没法从它们检索任何索引。
复制代码

经常使用存储引擎及适用场景

InnoDB架构

用于事务处理应用程序,支持外键和行级锁。若是应用对事物的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操做除了插入和查询以外,还包括不少更新和删除操做,那么InnoDB存储引擎是比较合适的。InnoDB除了有效的下降由删除和更新致使的锁定,还能够确保事务的完整提交和回滚,对于相似计费系统或者财务系统等对数据准确要求性比较高的系统都是合适的选择。

MyISAM

若是应用是以读操做和插入操做为主,只有不多的更新和删除操做,而且对事务的完整性、并发性要求不高,那么能够选择这个存储引擎。

Memory

将全部的数据保存在内存中,在须要快速定位记录和其余相似数据的环境下,能够提供极快的访问。Memory的缺陷是对表的大小有限制,虽然数据库由于异常终止的话数据能够正常恢复,可是一旦数据库关闭,存储在内存中的数据都会丢失。

存储引擎在mysql中的使用

存储引擎相关sql语句

复制代码
查看当前的默认存储引擎:

mysql> show variables like "default_storage_engine";

查询当前数据库支持的存储引擎

mysql> show engines \G;
复制代码
结果

指定存储引擎建表

在建表时指定

复制代码
mysql> create table ai(id bigint(12),name varchar(200)) ENGINE=MyISAM; 

mysql> create table country(id int(4),cname varchar(50)) ENGINE=InnoDB;

也可使用alter table语句,修改一个已经存在的表的存储引擎。

mysql> alter table ai engine = innodb;
复制代码

在配置文件中指定

#my.ini文件
[mysqld]
default-storage-engine=INNODB

 

 mysql的工做流程

MySQL架构总共四层,在上图中以虚线做为划分。 
  首先,最上层的服务并非MySQL独有的,大多数给予网络的客户端/服务器的工具或者服务都有相似的架构。好比:链接处理、受权认证、安全等。 
  第二层的架构包括大多数的MySQL的核心服务。包括:查询解析、分析、优化、缓存以及全部的内置函数(例如:日期、时间、数学和加密函数)。同时,全部的跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等。

  第三层包含了存储引擎。存储引擎负责MySQL中数据的存储和提取。服务器经过API和存储引擎进行通讯。这些接口屏蔽了不一样存储引擎之间的差别,使得这些差别对上层的查询过程透明化。存储引擎API包含十几个底层函数,用于执行“开始一个事务”等操做。但存储引擎通常不会去解析SQL(InnoDB会解析外键定义,由于其自己没有实现该功能),不一样存储引擎之间也不会相互通讯,而只是简单的响应上层的服务器请求。

  第四层包含了文件系统,全部的表结构和数据以及用户操做的日志最终仍是以文件的形式存储在硬盘上。