本文地址:https://www.askmac.cn/archives/mysql-storage-engines.html
第8章 存储引擎
章节概述
本章介绍如何MySQL中所使用的存储引擎。你会了解:
- 在MySQL性能上,存储引擎的使用分配所起到的效果
- 大多可用的存储引擎
- 每个引擎的特点及之间的不同之处
- 如何设置独立的存储引擎类型
8.1 MySQL存储引擎
当你在通过MySQL建立一张表时,你可以选择使用何种存储引擎。通常,这种选择决定取决于你对应用的需求以及存储引擎各自所能提供的特性而定。每个存储引擎都是一系列特定的操作特性,如使用锁来管理查询争用的方式,或如对应的表是否可提供事务或非事务的支持等。这些存储引擎的特性还涉及到对查询处理性能,并行性,避免死锁等功能。(死锁发生在多个查询互相等待对方完成且都被堵塞不能处理的时候。)
8.1.1 考虑特性
每个特定的存储引擎都包含有其唯一的特性和属性,其针对了不同场景及目的的需要。其中一些关键的不同包括了:
- 并行性(Concurrency) – 一些应用具有比其它应用更多的粒度锁要求(如行级锁)。选择正确的锁策略可以降低整体开销,这对整体性能有帮助。这个领域也包括了对如多版本并行控制或“快照”读能力的支持。
- 事务执行(Transaction Support) – 不是每种应用需要事务,但对那些需要的应用,这个特性满足了对ACID要求的遵守以及并行等级的改变。
- 参照完整性(Referential Integrity)– 这是一种需要强制遵守关系型数据库参照完整性的特性。
- 物理存储(Physical Storage)– 除了存储数据到物理磁盘的格式使用之外,还涉及到表和索引的所有页大小有关的所有东西。
- 索引支持(Index Support)– 不同的应用趋向于从不同的索引策略中获益,尽管一些如B-tree索引等所有引擎都通用的索引,还有一些索引是每个存储引擎通过自己的方式来生成的索引。
- 内存缓冲(Memory Caches)– 虽然有一些对所有引擎通用的内存缓冲设计(如用户连接,MySQL的告诉查询缓冲Query Cache等),不过不同的应用可以通过不同的存储引擎来得到独有且更佳的内存缓冲策略。
- 性能辅助(Performance Aids)– 其包含有如多I/O线程并行操作,线程并发,数据库检查点,批量插入处理及其它功能。
- 其他特性 – 其包括有地理操作支持,对某些数据修改操作的安全限制及其它等功能。
8.1.2 可用的存储引擎
MySQL提供并维护有几种存储引擎,且其也能和其它许多第三方存储引擎兼容。MySQL的存储引擎是一种数据库底层负责存储和获取数据的引擎,它通过MySQL内部API来进行访问,或在某种情况下可通过应用直接访问。请注意,应用可以在任意时刻访问多种存储引擎。第三方提供的引擎可提供不同资源和特性。以下列出了当前所支持的存储引擎。
MySQL开发的存储引擎:
- MyISAM
- Falcon
- NDB/Cluster
- MEMORY
- ARCHIVE
- FEDERATED
- BLACKHOLE
- CSV
第三方存储引擎:
- InnoDB (由2005年被Oracle收购成为其产品)
- solidDB
- InfoBright – BrightHouse
- Nitro
- PBXT
注意:以上所出的一部分引擎会在本章节的之后部分具体讨论。
8.1.3 存储引擎设置
为了使用CREATE TABLE语句显示设置一个存储引擎,需要使用ENGINE项进行设置。例如建立一张表名为t的InnoDB表:
mysql> create table t(i int) engine=InnoDB;
如果在建立表时未显式加上ENGINE项语句,MySQL服务端会使用默认存储引擎进行表建立,而且默认存储引擎是由系统变量default_storage_engine值来确定的。
如果需要改变已建立的表的存储引擎可以使用ALTER TABLE语句,如:
mysql> alter table t engine=MEMORY;
注意:为了避免无意的数据损失,ALTER TABLE不能被用于改变BLACKHOLE引擎表的存储引擎。
8.1.4 显示存储引擎信息
为了判断哪些存储引擎被用于了指定表,你可以使用SHOW CREATE TABLE或SHOW TABLE STATUS语句:
当然我们可以查看INFORMATION_SCHEMA数据库TABLES表来查看相应信息:
尽管你可以为表选择使用哪种存储引擎,在大多方面来说,你在建表后对表进行的操作都是引擎独立的。对于表的所有类型的操作都使用的是SQL接口,而MySQL则在整个架构的更底层为你负责对引擎依赖的部分的管理。但是,还是很有必要了解哪个引擎可以使你在使用表时更有效率。注意,一个存储引擎是否是支持事务的对你如何进行交互操作有很大的影响(除非你不使用事务)。
在你能够使用一个获取到的存储引擎之前,它必须被编译入服务端软件且被启用。MySQL Server使用的是一种模块化架构:每种存储引擎都是一个软件模块,且需要被编译如服务端。这种设计使用使得存储引擎可以在配置时进行简单的选择是否包含在服务端中。
注意:从MySQL 5.1开始,存储引擎就可以在运行时被添加,而不是非要在编译的时候进行添加。
8.1.5 查看可用的存储引擎
可能MySQL服务端不会支持所有可用的存储引擎。其引擎的真实可用性取决于你MySQL的版本,服务端在build时候的配置,以及启动时候的配置项。为了查看哪些存储引擎已经被编译进入你当前的服务端且现在运行时是否可用,可使用SHOW ENGINES语句:
其中Support列值YES或NO指的是其引擎是否受到支持,如果值为DISABLED,说明引擎受到支持但是现在是禁用状态,而DEFAULT则表示其作为默认存储引擎且为可用状态。
Comment