备注:以下关于5.7版本的内容是来源于官方文档:https://dev.mysql.com/doc/refman/5.7/en/storage-engines.html 以下关于5.6版本的内容,一部分来源于自己使用过程中的经验总结,一部分来源于:http://www.w3resource.com/mysql/mysql-storage-engines.php 本来应该标记为译文比较合适,但中间又夹杂了一些自己的使用经历,不知道怎么合适,也就不知好歹的标记了个原创, 恳请指正!
一、基本概述
存储引擎,是MySQL的一个组件,它用于处理不同类型表的SQL操作。InnoDB是MySQL默认的,也是最为常用的存储引擎。在非特殊要求的使用情况下,这也是Oracle极力推荐使用的一种存储引擎。
MySQL服务,使用可插拔的存储引擎架构,这样就使得存储引擎能够在一台运行的MySQL服务商,被装载或者被卸载。
要想知道自己的服务支持哪一种存储引擎,就得使用‘显示引擎’命令语句。这些值里面的数据则可以表示你是否可以使用某一种引擎,这些值里面会包含:yes,no,default。它们分别表示,可以使用,不支持和当前的默认引擎.
二、5.7支持的存储引擎
2.1,5.6版本引擎支持
经过命令查询,5.6所支持的引擎有(下图并未截取完整,只是为了说明这个数据的有效性):MRG_MYISAM、MyISAM、BLACKHOLE、CSV、MEMORY、ARCHIVE、InnoDB、PERFORMANCE_SCHEMA
2.2,5.7版本引擎支持(来源于官方文档)
InnoDB、MyISAM、Memory、CSV、Archive、Blackhole、NDB(NDBCLUSTER)、Merge、Federated、Example
2.3,各引擎的特点和功能
首先,总结一下5.7格外支持的存储引擎:NDB(NDBCLUSTER)、Federated、Example PS:有些是一致的,比如说5.7的Merge和5.6的MRG_MYISAM
2.3.1,主要特点
InnoDB:从5.5开始,InnoDB是MySQL的默认存储引擎。它是事务安全的,提供:事务提交、回滚和恢复功能,以此保护用户的数据。InnoDB的行级锁和Oracle风格的无锁读操作,使其能够更好的应对高并发的情况,提高其性能。它允许用户以聚集索引的形式存储数据,以此减少常见的基于主键的I/O请求。而为了维护数据的完整性,它也支持外键完整性约束。
MyISAM:表级锁限制了读/写的工作负载,所以,它经常被配置用于只读,或者主要工作是读的环境中。
PS:简单说一下行级锁、表级锁、页级锁:行级,是说锁定具体的某一行数据,当一个操作获取行级锁时,其他的操作只能等待锁释放;表级,锁住全表,只能同时对于一个表进行读操作,不能同时写;页级,折中行级和表级,它锁住临近的数据记录,可以理解为锁定一页记录。
MEMORY:将所有的数据存储在随机读写存储器里面(RAM),主要是用于要求快速访问查找的环境中。这种引擎也被成为堆引擎,但随着使用的减少,InnoDB利用缓冲池数据区,提供了一个常用持久性的方法,将大部分数据,甚至是所有数据存储在内存里。NDBCLUSTER在同时也提供了一个巨大的分布式快速的键值查找方案。
CSV:它的表是使用逗号分隔的文本文件,允许用户导入或者转存CSV格式的数据,在交换脚本数据时,应该保证他们读写时的格式是一致的。由于CSV的表并没有索引,所以应该保证数据在innoDB的表中进行一般操作,而仅仅使用CSV表去进行导入或者导出。
Archive:这些紧凑的索引表用于存储和检索大量很少引用的历史,存档,或安全审计信息。
BLACKHOLE:接收但不存储数据,类似于UNIX /dev/null设备。查询总是返回空集。这些表可以在主服务器上配置,用于复制DML语句发送到从服务器,但主服务器不保持其数据副本。
NDB(NDBCLUSTER):该数据库集群机特别适合于需要在正常运行时间提供高可用服务的环境。NDBCLUSTER在同时也提供了一个巨大的分布式快速的键值查找方案
Merge:使MySQL DBA或开发人员能够对一系列的MyISAM表进行逻辑分组并将它们作为一个对象引用。非常适合大型数据库,如:数据仓库中使用
Federated:提供连接独立的MySQL服务器从多个物理服务器创建一个逻辑数据库的能力。非常好的分布式或数据集群环境。
example:这个引擎作为MySQL源代码的一个例子,说明如何开始编写新的存储引擎。它主要是满足开发商的兴趣。存储引擎是一个“存根”,什么也不做。您可以使用此引擎创建表,但没有数据可以存储在其中或从它们中检索。
2.3.2,功能(部分)
功能 | MyIsam | Memory | InnoDB | Archive | NDB |
存储限制 | 256TB | RAM | 64TB | None | 384EB |
事务 | No | No | Yes | No | yes |
锁粒度 | 表级 | 表级 | 行级 | 行级 | 行级 |
多版本并发控制 | No | No | Yes | No | no |
支持地理空间数据 | Yes | No | Yes | Yes | Yes |
支持空间索引 | Yes | No | Yes(5.7.5-) | No | No |
B_tree索引 | Yes | Yes | Yes | No | No |
T_tree索引 | No | No | No | No | Yes |
Hash索引 | No | Yes | No(使用InnoDB内部的hash索引功能) | No | Yes |
全文索引 | Yes | No | Yes(5.6.4-) | No | No |
聚合索引 | No | No | Yes | No | No |
数据缓存 | No | N/A | Yes | No | Yes |
索引缓存 | Yes | N/A | Yes | No | Yes |
数据压缩 | Yes(limit:compressed row format) | No | Yes(limit: Barracuda file format) | Yes | No |
数据加密 | Yes | Yes | Yes | Yes | Yes |
支持集群 | No | No | No | No | Yes |
备份、快照服务 | Yes | ||||
查询缓存 | |||||
数据字典更新 |
三、总结
每种存储引擎都有其自己的特点和支持的功能,但是,值得注意的是,在一个数据库中,不必全都使用同一种引擎,而可以根据需要,为某一张表指定合适的存储引擎。
一般在创建表的时候会指定引擎,如果没有,则使用默认的:
CREATE TABLE Cars(Id INTEGER PRIMARY KEY, Name VARCHAR(50), Cost INTEGER) ENGINE='MyISAM';
当需要修改存储引擎的时候:
ALTER TABLE Cars ENGINE='InnoDB';
当需要查询一张表所使用的引擎时:
SELECT ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA='mydb' AND TABLE_NAME='Cars';
后记:姑娘,InnoDB是无法实现集群的,你知道了没?
从各个情况来看,我们项目里面常用的引擎,是这三种:NDB(集群)、MyISAM(快速读,读写分离时)、InnoDB(支持事务,行级锁)