<p>数据库存储引擎是数据库底层软件组件,数据库管理系统使用数据引擎进行创建、查询、更新和删除数据操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎还可以获得特定的功能。</p><p>现在许多数据库管理系统都支持多种不同的存储引擎。MySQL 的核心就是存储引擎。那么mysql存储引擎有哪些?</p><p><strong>MySQL存储引擎之MyISAM</strong></p><p>不支持事务,适用于选择密集型,插入密集型, mysql 默认的引擎,该引擎基于ISAM,除了提供ISAM所没有的索引和字段管理等大量功能。MyISAM还使用一种表锁机制来优化多个并发读写操作,但需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间,否则碎片也会随之增加,最终影响数据访问性能。还有一些有用的扩展,例如用来修复数据库文件的MyISAM Chk工具和用来恢复浪费空间的 MyISAM Pack工具MyISAM强调了快速读取操作,主要用于高负载的select,这可能也是MySQL深受Web开发的主要原因:在Web开发中进行的大量数据操作都是读,所以大多数虚拟主机提供商和Internet平台提供商(Internet Presence Provider,IPP)只允许使用MyISAM格式。</p><p><strong><strong style="white-space: normal;">MySQL存储引擎之</strong>InnoDB</strong></p><p>适用于更新密集型,支持事务,自动灾难恢复,行锁,外键<br/>该存储引擎为MySQL表提供了ACID事务支持、系统崩溃修复能力和多版本并发控制(即MVCC Multi-Version Concurrency Control)的行锁<br/>支持自增长列(auto_increment),自增长列的值不能为空,如果在使用的时候为空则自动从现有值开始增值,如果有但是比现在的还大,则直接保存这个值<br/>支持外键(foreign key) ,外键所在的表称为子表而所依赖的表称为父表。<br/>该引擎在5.5后的MySQL数据库中为默认存储引擎。</p><p><strong><strong style="white-space: normal;">MySQL存储引擎之</strong>MERGE</strong></p><p>Merge允许将一组使用MyISAM存储引擎的并且表结构相同(即每张表的字段顺序、字段名称、字段类型、索引定义的顺序及其定义的方式必须相同)的数据表合并为一个表,方便了数据的查询。</p><p>场景:MySQL中没有物化视图,视图的效率极低,故数据仓库中数据量较大的每天、每周或者每个月都创建一个单一的表的历史数据的集合可以通过Merge存储引擎合并为一张表。</p><p><strong><strong style="white-space: normal;">MySQL存储引擎之</strong>MEMORY(HEAP)</strong></p><p><br/></p><p>MEMORY存储引擎用存在内存中的内容来创建表。这些在以前被认识为HEAP表。MEMORY是一个首选的术语,虽然为向下兼容,HEAP依旧被 支持。 每个MEMORY表和一个磁盘文件关联起来。文件名由表的名字开始,并且由一个.frm的扩展名来指明它存储的表定义。 要明确指出</p><p>MEMORY存储引擎用存在内存中的内容来创建表。这些在以前被认识为HEAP表。MEMORY是一个首选的术语,虽然为向下兼容,HEAP依旧被 支持。 <br/>每个MEMORY表和一个磁盘文件关联起来。文件名由表的名字开始,并且由一个.frm的扩展名来指明它存储的表定义。 </p><p><strong><strong style="white-space: normal;">MySQL存储引擎之</strong>BDB(BerkeleyDB)</strong></p><p>Berkeley DB(BDB)是一个高性能的嵌入式数据库编程库(引擎),它可以用来保存任意类型的键/值对 (Key/Value Pair),而且可以为一个键保存多个数据。Berkeley DB可以支持数千的并发线程同时操作数据库,支持最大256TB的数据。</p><p>BDB提供诸如C语言,C++,Java,Perl,Python,Tcl等多种编程语言的API,并且广泛支持大多数类Unix操作系统和Windows操作系统以及实时操作系统(如 VxWorks)。</p><p><strong><strong style="white-space: normal;">MySQL存储引擎之</strong>EXAMPLE</strong></p><p>EXAMPLE存储引擎是一个“存根”引擎,它不做什么。你可以用这个引擎创建表,但没有数据被存储于其中或从其中检索。这个引擎的目的是服务,在MySQL源代码中的一个例子,它演示说明如何开始编写新存储引擎。同样,它的主要兴趣是对开发者。</p><p><strong><strong style="white-space: normal;">MySQL存储引擎之</strong>FEDERATED</strong></p><p>FEDERATED存储引擎把数据存在<a>远程</a>数据库中。在MySQL 5.1中,它只和MySQL一起工作,使用MySQL C Client API。在未来的分发版中,我们想要让它使用其它驱动器或客户端连接方法连接到另外的数据源。</p><p>插件式存储引擎体系结构提供了标准的管理和支持服务集合,它们对所有的基本存储引擎来说是共同的。存储引擎本身是数据库服务器的组件,负责对在物理服务器层面上维护的基本数据进行实际操作。</p><p>这是一种高效的模块化体系结构,它为那些希望专注于特定应用需求的人员提供了巨大的便利和益处,这类特殊应用需求包括数据仓储、事务处理、高可用性情形等,同时还能利用独立于任何存储引擎的一组接口和服务。</p><p>应用程序编程人员和DBA通过位于存储引擎之上的连接器API和服务层来处理MySQL数据库。如果应用程序的变化需要改变底层存储引擎,或需要增加1个或多个额外的存储引擎以支持新的需求,不需要进行大的编码或进程更改就能实现这类要求。MySQL服务器体系结构提供了一致和易于使用的API,这类API适用于多种存储引擎,通过该方式,该结构将应用程序与存储引擎的底层复杂性隔离开来。</p><p><strong><strong style="white-space: normal;">MySQL存储引擎之</strong>ARCHIVE</strong></p><p>ARCHIVE引擎只允许插入和查询,不允许修改和删除。相当于拥有只读权限和写入权限,没有修改权限和删除权限。我突然想到这种东西有点类似于主从同步中的从库,但是又拥有写入权限,还是比较特殊的。</p><p>在一些固定死的配置中,可以用这个表,杜绝程序员或者运营等人的错误操作或者尝试修改。从根本上保证数据的安全性。当然了由于时代变化的太快了,需求 逻辑等等总是在变化,这种固定的东西很有可能受到前所未有的推翻和冲击,到时候确实需要改怎么办呢??</p><p>可以尝试将表引擎先修改为InnoDB引擎,然后修改 改好了之后再改为ARCHIVE引擎,问题是不要用索引,包括主键id等,这个表就用来存东西还是蛮好的。</p><p><strong><strong style="white-space: normal;">MySQL存储引擎之</strong>CSV</strong></p><p>CSV引擎有点类似Oracle的外部表。它可以将“逗号分隔值(CSV)文件”作为表进行处理,但不支持在这种文件上建立相关索引。在服务器运行中,这种引擎支持从数据库中拷入/拷出CSV文件。如果从电子表格软件输出一个CSV文件,将其存放在MySQL服务器的数据目录中,服务器就能够马上读取相关的CSV文件。同样,如果写数据库到一个CSV表,外部程序也可以立刻读取它。在实现某种类型的日志记录时,CSV表作为一种数据交换格式,特别有用。</p><p><strong><strong style="white-space: normal;">MySQL存储引擎之</strong>BLACKHOLE</strong></p><p>该存储引擎支持事务,而且支持mvcc的行级锁,写入这种引擎表中的任何数据都会消失,主要用于做日志记录或同步归档的中继存储,这个存储引擎除非有特别目的,否则不适合使用。</p><p>该存储引擎接受但不存储数据,但是如果MySQL启用了二进制日志,SQL语句被写入日志(并被复制到从服务器)。</p><p>用于做日志记录或同步归档的中继存储。但这种应用方式会碰到很多问题,因此并不推荐。</p><p>支持事务,而且支持mvcc的行级锁。</p>