MySQL中的数据用各类不一样的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不一样的存储机制、索引技巧、锁定水平而且最终提供普遍的不一样的功能和能力。经过选择不一样的技术,可以得到额外的速度或者功能,从而改善应用的总体功能。mysql
若是在研究大量的临时数据,也许须要使用内存存储引擎。内存存储引擎可以在内存中存储全部的表格数据。又或许须要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力)。这些不一样的技术以及配套的相关功能在MySQL中被称做存储引擎(也称做表类型)。 sql
MySQL默认配置了许多不一样的存储引擎,能够预先设置或者在MySQL服务器中启用。能够选择适用于服务器、数据库和表格的存储引擎,以便在选择如何存储你的信息、如何检索这些信息以及你须要你的数据结合什么性能和功能的时候为你提供最大的灵活性。选择如何存储和检索数据的这种灵活性是MySQL为何如此受欢迎的主要缘由。其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储。数据库
遗憾的是,其它类型的数据库解决方案采起的“一个尺码知足一切需求”的方式意味着你要么就牺牲一些性能,要么你就用几个小时甚至几天的时间详细调整你的数据库。使用MySQL,咱们仅须要修改咱们使用的存储引擎就能够了安全
mysql5.6支持的存储引擎包括InnoDB、MyISAM、MEMORY、CSV、BLACKHOLE、FEDERATED、MRG_MYISAM、ARCHIVE、PERFORMANCE_SCHEMA。其中NDB和InnoDB提供事务安全表,其余存储引擎都是非事务安全表。服务器
存储引擎的特性:并发
并发性:某些应用程序比其余应用程序具备不少的颗粒级锁定要求(如行级锁定)。 事务支持:并不是全部的应用程序都须要事务,但对的确须要事务的应用程序来讲,有着定义良好的需求,如ACID兼容等。 引用完整性:经过DDL定义的外键,服务器须要强制保持关联数据库的引用完整性。 物理存储:它包括各类各样的事项,从表和索引的总的页大小,到存储数据所需的格式,到物理磁盘。 索引支持:不一样的应用程序倾向于采用不一样的索引策略,每种存储引擎一般有本身的编制索引方法,但某些索引方法(如B-tree索引)对几乎全部的存储引擎来讲是共同的。 内存高速缓冲:与其余应用程序相比,不一样的应用程序对某些内存高速缓冲策略的响应更好,所以,尽管某些内存高速缓冲对全部存储引擎来讲是共同的(如用于用户链接的高速缓冲,MySQL的高速查询高速缓冲等),其余高速缓冲策略仅当使用特殊的存储引擎时才惟必定义。 性能帮助:包括针对并行操做的多I/O线程,线程并发性,数据库检查点,成批插入处理等。 其余目标特性:可能包括对地理空间操做的支持,对特定数据处理操做的安全限制等。
存储引擎简单介绍分布式
InnoDB MySQL5.6版本默认的存储引擎。InnoDB 是一个事务安全的存储引擎,它具有提交、回滚以及崩溃恢复的功能以保护用户数据。InnoDB 的行级别锁定以及 Oracle 风格的一致性无锁读提高了它的多用户并发数以及性能。InnoDB 将用户数据存储在汇集索引中以减小基于主键的普通查询所带来的 I/O 开销。为了保证数据的完整性,InnoDB 还支持外键约束。 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 源码的例子。它主要针对于有兴趣的开发人员。这种存储引擎就是一个啥事也不作的 "存根"。你可使用这种引擎建立表,可是你没法向其保存任何数据,也没法从它们检索任何索引。
经常使用存储引擎及其应用场景ide
Innodb:
用于事务处理应用程序,支持外键和行级锁。若是对事物的完整性要求很高,且在并发条件下要求数据的一致性,数据操做除了插入和查询以外,还包括不少更新和删除操做,那么InnoDB存储引擎是比较合适的。
InnoDB除了有效的下降由删除和更新致使的锁定,还能够确保事务的完整提交和回滚,对于相似计费系统或者财务系统等对数据准确要求性比较高的系统都是合适的选择。
MyISAM:
若是应用是以读和插入操做为主,只有不多的更新和删除操做,并对事务的完整性并发性要求不那么高,能够选择MyISAM做为存储引擎。
Memory:
全部数据存储在内存中,在须要快速定位记录和其余相似数据的状况下,能够极快的提供访问,Memory的缺陷就是对表的大小有限制,虽然数据库由于异常终止的话数据能够正常恢复,可是一旦数据库关闭,存储在内存中的数据都会丢失。
# 查看当前默认的搜索引擎 mysql> show variables like "default_storage_engine"; # 查询当前数据库支持的存储引擎 mysql> show engine \G; # 指定存储引擎建表 mysql> create table qiubai(id int(2), name varchar(16)) ENGINE=MyISAM; # 也可使用alter table语句来修改一个已经存在的表的存储引擎 mysql> alter table qiubai engine=innodb; # 在配置文件中指定my.ini [mysqld] default-storage-engine=INNODB