存储引擎是什么?数据库
MySQL中的数据用各类不一样的技术存储在文件(或者内存 )中。这些技术中的每一种技术都使用不一样的存储机制、索引技巧、锁定水平而且最终提供普遍的不一样的功能和能力。经过选择不一样的技术,你可以得到额外的速度或者功能,从而改善你的应用的总体功能。缓存
例如,若是你在研究大量的临时数据,你也许须要使用内存存储引擎。内存存储引擎可以在内存中存储全部的表格数据。又或者,你也许须要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力)。安全
这些不一样的技术以及配套的相关功能在MySQL中被称做存储引擎(也称做表类型)。MySQL默认配置了许多不一样的存储引擎,能够预先设置或者在MySQL服务器中启用。你能够选择适用于服务器、数据库和表格的存储引擎,以便在选择如何存储你的信息、如何检索这些信息以及你须要你的数据结合什么性能和功能的时候为你提供最大的灵活性。服务器
选择如何存储和检索你的数据的这种灵活性是MySQL为何如此受欢迎的主要缘由。其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储。遗憾的是,其它类型的数据库解决方案 采起的“一个尺码知足一切需求”的方式意味着你要么就牺牲一些性能,要么你就用几个小时甚至几天的时间详细调整你的数据库。使用MySQL,咱们仅须要修改咱们使用的存储引擎就能够了。数据结构
在这篇文章中,咱们不许备集中讨论不一样的存储引擎的技术方面的问题(尽管咱们不可避免地要研究这些因素的某些方面),相反,咱们将集中介绍这些 不一样的引擎分别最适应哪一种需求和如何启用不一样的存储引擎。为了实现这个目的,在介绍每个存储引擎的具体状况以前,咱们必需要了解一些基本的问题.ide
如何肯定有哪些存储引擎可用性能
你能够在MySQL(假设是MySQL服务器 5.6以上版本)中使用显示引擎的命令获得一个可用引擎的列表。spa
这个表格显示了可用的数据库引擎的所有名单以及在当前的数据库服务器中是否支持这些引擎。命令行
使用一个指定的存储引擎对象
你可使用不少方法指定一个要使用的存储引擎。最简单的方法是,若是你喜欢一种能知足你的大多数数据库需求的存储引擎,你能够在MySQL设置文件中设置一个默认的引擎类型(使用storage_engine 选项)或者在启动数据库服务器时在命令行后面加上--default-storage-engine或--default-table-type选项 。
更灵活的方式是在随MySQL服务器发布同时提供的MySQL客户端时指定使用的存储引擎。最直接的方式是在建立表时指定存储引擎的类型,向下面这样:
CREATE TABLE mytable (id int, title char(20)) ENGINE = INNODB
你还能够改变现有的表使用的存储引擎,用如下语句:
ALTER TABLE mytable ENGINE = MyISAM
然而,你在以这种方式修改表格类型的时候须要很是仔细,由于对不支持一样的索引、字段类型或者表大小的一个类型进行修改可能使你丢失数据。若是你指定一个在你的当前的数据库中不存在的一个存储引擎,那么就会建立一个MyISAM(默认的)类型的表。
各存储引擎之间的区别
为了作出选择哪个存储引擎的决定,咱们首先须要考虑每个存储引擎提供了哪些不一样的核心功能。这种功能使咱们可以把不一样的存储引擎区别开来。咱们 通常把这些核心功能分为四类:支持的字段和数据类型、锁定类型、索引和处理。一些引擎具备能过促使你作出决定的独特的功能,咱们一下子再仔细研究这些具体 问题。
字段和数据类型
虽然全部这些引擎都支持通用的数据类型,例如整型、实型和字符型等,可是,并非全部的引擎都支持其它的字段类型,特别是BLOG(二进制大对象)或者TEXT文本类型。其它引擎也许仅支持有限的字符宽度和数据大小。
这些局限性可能直接影响到你能够存储的数据,同时也可能会对你实施的搜索的类型或者你对那些信息建立的索引产生间接的影响。这些区别可以影响你的应用程序的性能和功能,由于你必需要根据你要存储的数据类型选择对须要的存储引擎的功能作出决策。
锁定
数据库引擎中的锁定功能决定了如何管理信息的访问和更新。当数据库中的一个对象为信息更新锁定了,在更新完成以前,其它处理不能修改这个数据(在某些状况下还不容许读这种数据)。
锁定不只影响许多不一样的应用程序如何更新数据库中的信息,并且还影响对那个数据的查询。这是由于查询可能要访问正在被修改或者更新的数据。总的 来讲,这种延迟是很小的。大多数锁定机制主要是为了防止多个处理更新同一个数据。因为向数据中插入信息和更新信息这两种状况都须要锁定,你能够想象,多个 应用程序使用同一个数据库可能会有很大的影响。
不一样的存储引擎在不一样的对象级别支持锁定,并且这些级别将影响能够同时访问的信息。获得支持的级别有三种:表锁定、块锁定和行锁定。支持最多的 是表锁定,这种锁定是在MyISAM中提供的。在数据更新时,它锁定了整个表。这就防止了许多应用程序同时更新一个具体的表。这对应用不少的多用户数据库 有很大的影响,由于它延迟了更新的过程。
页级锁定使用Berkeley DB引擎,而且根据上载的信息页(8KB)锁定数据。当在数据库的不少地方进行更新的时候,这种锁定不会出现什么问题。可是,因为增长几行信息就要锁定数据结构的最后8KB,当须要增长大量的行,也别是大量的小型数据,就会带来问题。
行级锁定提供了最佳的并行访问功能,一个表中只有一行数据被锁定。这就意味着不少应用程序可以更新同一个表中的不一样行的数据,而不会引发锁定的问题。只有InnoDB存储引擎支持行级锁定。
创建索引
创建索引在搜索和恢复数据库中的数据的时候可以显著提升性能。不一样的存储引擎提供不一样的制做索引的技术。有些技术也许会更适合你存储的数据类型。
有些存储引擎根本就不支持索引,其缘由多是它们使用基本表索引(如MERGE引擎)或者是由于数据存储的方式不容许索引(例如FEDERATED或者BLACKHOLE引擎)。
事务处理
事务处理功能经过提供在向表中更新和插入信息期间的可靠性。这种可靠性是经过以下方法实现的,它容许你更新表中的数据,但仅当应用的应用程序的 全部相关操做彻底完成后才接受你对表的更改。例如,在会计处理中每一笔会计分录处理将包括对借方科目和贷方科目数据的更改,你须要要使用事务处理功能保证 对借方科目和贷方科目的数据更改都顺利完成,才接受所作的修改。若是任一项操做失败了,你均可以取消这个事务处理,这些修改就不存在了。若是这个事务处理 过程完成了,咱们能够经过容许这个修改来确认这个操做。
至此为止,咱们介绍了MySQL存储引擎的相关基本概念,在下一篇文章里,咱们会分别介绍各类MySQL存储引擎。
你能够经过修改设置脚本中的选项来设置在MySQL安装软件中可用的引擎。若是你在使用一个预先包装好的MySQL二进制发布版软件,那么,这个软件就包含了经常使用的引擎。然而,须要指出的是,若是你要使用某些不经常使用 的引擎,特别是CSV、RCHIVE(存档)和BLACKHOLE(黑洞)引擎,你就须要手工从新编译MySQL源码 。
MySQL存储引擎比较
MySQL经常使用的存储引擎为MyISAM、InnoDB、MEMORY、MERGE,其中InnoDB提供事务安全表,其余存储引擎都是非事务安全表。
MyISAM是基于ISAM存储引擎。MyISAM不支持事务、也不支持外键,但其访问速度快,对事务完整性没有要求。
InnoDB是目前MySQL版本的默认存储引擎。它提供了,具备提交、回滚和崩溃恢复能力的事务安全。可是比起MyISAM存储引擎,InnoDB写的处理效率差一些而且会占用更多的磁盘空间以保留数据和索引。
MEMORY存储引擎使用存在内存中的内容来建立表。每一个MEMORY表只实际对应一个磁盘文件。MEMORY类型的表访问很是得快,由于它的数据是放在内存中的,而且默认使用HASH索引。可是一旦服务关闭,表中的数据就会丢失掉。
MERGE存储引擎是一组MyISAM表的组合,这些MyISAM表必须结构彻底相同。MERGE表自己没有数据,对MERGE类型的表进行查询、更新、删除的操做,就是对内部的MyISAM表进行的。
MyISAM表还支持3中不一样的存储格式:
1 静态表
2 动态表
3 压缩表
静态表是默认的存储格式,静态表中的字段都是非变长的字段,优势是:存储很是迅速,容易缓存,出现故障容易恢复;缺点是:占用的空间一般比动态表多。(注意: 在存储时,列的宽度不足时,用空格补足,当时在访问的时候并不会获得这些空格)
动态表的字段是变长的,优势是:占用的空间相对较少,可是频繁地更新删除记录会产生碎片,须要按期改善性能,而且出现故障的时候恢复相对比较困难。
压缩表占用磁盘空间小,每一个记录是被单独压缩的,因此只有很是小的访问开支。
MySQL支持外键存储引擎只有InnoDB,在建立外键的时候,要求附表必须有对应的索引,子表在建立外键的时候也会自动建立对应的索引。
InnoDB存储方式为两种:1 使用共享表空间存储 2 使用多表空间
MEMORY 类型的存储引擎主要用于那些内容变化不频繁的代码表,或者做为统计操做的中间结果表,便于高效地堆中间结果进行分析并获得最终的统计结果。对MEMORY 存储引擎的表进行更新操做要谨慎,由于数据并无实际写入到磁盘中,因此必定要对下次从新启动服务后如何得到这些修改后的数据有所考虑。
MERGE用于将一系列等同的MyISAM表以逻辑方式组合在一块儿,并做为一个对象引用它。MERGE表的优势在于能够突破对单个MyISAM表大小的限制,经过将不一样的表分布在多个磁盘上,能够有效的改善MERGE表的访问效率。
功能 | MyISAM | Memory | InnoDB | Archive |
存储限制 | 256TB | RAM | 64TB | None |
支持事务 | No | No | Yes | No |
支持全文索引 | Yes | No | No | No |
支持数索引 | Yes | Yes | Yes | No |
支持哈希索引 | No | Yes | No | No |
支持数据缓存 | No | N/A | Yes | No |
支持外键 | No | No | Yes | No |