MySQL架构三:存储引擎之内建的其他存储引擎

MySQL还有一些由特殊用途的存储引擎。在新版本中,有些可能因为一些原因已经不再支持;另外还有些会继续支持,但是需要明确的启用后才能使用。

1 Archive引擎

Archive存储引擎只支持Insert和Select操作,在MySQL5.1之前也不支持索引。Archive引擎会缓存所有的写操作并利用zlib对插入的行进行压缩,所以比MyISAM表的磁盘I/O少。但是每次select查询都需要执行全表扫描。所以Archive表适合日志和数据采集类应用,这类应用做数据分析时往往需要权标骚婊。或者在一些需要更快速的insert操作的场合下也可以使用。

Archive引擎支持行级锁和专用的缓冲区,所以可以实现高并发的插入。在一个查询开始直到返回表中存在的所有行数之前,Archive引擎会组织其他的select执行,以实现一致性读。另外,也实现了批量插入在完成之前对读操作是不可见的。这种机制模仿了事物和MVCC的一些特性,但Archive引擎不是一个事物型的引擎,而是一个针对高速插入和压缩做了优化的简单引擎。

2 Blackhole引擎

Blackhole引擎没有实现任何的存储机制,它会丢弃所有插入的数据,不做任何保存。但是服务器会记录Blackhole表的日志,所以可以用于赋值数据库到备库,或者只是简单的记录到日志。这种特殊的存储引擎可以在一些特殊的复制架构和日志审核时发挥作用。但这种应用方式会产生很多问题,因此不推荐。

3 CSV引擎

CSV引擎可以将普通的CSV文件(逗号分割值的文件)作为MySQL的表来处理,但这种表不支持索引。CSV引擎可以在数据库运行时拷入或拷出文件。可以将Excel等调子表格软件中的数据存储为CSV文件,然后复制到MySQL数据目录下,就能在MySQL中打开使用。同样,如果将数据写入到一个CSV引擎表,其他的外部程序也能立即从表的数据文件中读取CSV格式的数据。因此CSV引擎可以作为一种数据交换的机制,非常有用。

4 Federated引擎

Federated引擎是访问其他MySQL服务器的一个代理,它会创建一个到远程MySQL服务器的客户端连接,并将查询传输到远程服务器执行,然后提取或者发送需要的数据。最初设计该存储引擎是为了和企业级数据库如Microsoft SQL Server和Oracle的类似特性竞争的,可以说更多的是一种市场行为。尽管该引擎看起来提供了一种很好的跨服务器的灵活性,但也经常带来问题,因此默认是禁用的。MariaDB使用了它的一个后续改进版本,叫做FederatedX。

5 Memory引擎

如果需要快速的访问数据,并且这些数据不会被修改,重启以后丢失也没有关系,那么使用Memory表(以前也叫HEAP表)是非常有用的。Memory表至少比MyISAM表要快一个数量级,因此所有的数据都保存在内存中,不需要进行磁盘I/O。Memory表的结构在重启以后还会保留,但数据会丢失。

Memroy的应用场景:

    ① 用于查找(lookup)或者映射表,例如将邮编和城市名映射的表

    ② 用于缓存周期性聚合数据(periodically aggregated data)的结果。

    ③ 用于保存数据分析中产生的中间数据

Memory表支持Hash索引,因此查找操作非常快。虽然Memory表的速度非常快,但还是无法取代传统的基于磁盘的表。Memroy表时表级锁,因此并发写入的性能较低。它不支持BLOB或TEXT类型的列,并且每行的长度是固定的所以即使制定了VARCHAR列,实际存储时也会转换成CHAR,这可能导致部分内存的浪费(其中一些限制在Percona版本中已解决)。

如果MySQL在执行查询的过程中需要使用临时表来保存中间结果,内部使用的临时表就是Memory表。如果中间结果太大超出了Memory表的限制,或者含有BLOB或TEXT字段 ,则临时表会转换成MyISAM表。

注:

人们经常混淆Memory表和临时表。临时表是指使用create temporary table 语句创建的表,它可以使用任何存储引擎,因此和Memory表不是一回事。临时表只在单个连接中可见,当连接断开时,临时表将删除。

6 Merge引擎

Merge引擎是MyISAM引擎的一个变种。Merge表时由多个MyISAM表合并而来的虚拟表。如果将MySQL用于日志或者数据仓库类应用,该引擎可以发挥作用。但是引入分区功能后,该引擎已经被放弃。

7 NDB集群引擎

2003年时MySQL AB公司从索尼爱立信公司收购了NDB数据库,然后开发了NDB集群存储引擎,作为SQL和NDB原生协议之间的接口。MySQL服务器、NDB集群存储引擎,以及分布式的、share-nothing的容灾的、高可用的NDB数据库的组合,被从未MySQL集群(MySQL Cluster)。后面应该会单独写一篇文章来详细讲解MySQL集群

你可能感兴趣的:(MySQL)