存储引擎是MySQL组件,用于处理不同表类型的SQL操作。
InnoDB是默认的、最通用的存储引擎,Oracle默认使用其创建表。(MySQL 8.0中的CREATE TABLE语句默认创建InnoDB表。)
MySQL Server使用可插拔存储引擎体系结构,使存储引擎能够加载到正在运行的MySQL服务器中或从中卸载。
要确定服务器支持哪些存储引擎,请使用SHOW engines语句。
Support列中的值指示是否可以使用引擎。值YES、NO或DEFAULT表示某个引擎可用、不可用或可用,并且当前设置为默认存储引擎。
mysql> SHOW ENGINES\G
*************************** 1. row ***************************Engine: PERFORMANCE_SCHEMASupport: YESComment: Performance Schema
Transactions: NOXA: NOSavepoints: NO
*************************** 2. row ***************************Engine: InnoDBSupport: DEFAULTComment: Supports transactions, row-level locking, and foreign keys
Transactions: YESXA: YESSavepoints: YES
*************************** 3. row ***************************Engine: MRG_MYISAMSupport: YESComment: Collection of identical MyISAM tables
Transactions: NOXA: NOSavepoints: NO
*************************** 4. row ***************************Engine: BLACKHOLESupport: YESComment: /dev/null storage engine (anything you write to it disappears)
Transactions: NOXA: NOSavepoints: NO
*************************** 5. row ***************************Engine: MyISAMSupport: YESComment: MyISAM storage engine
Transactions: NOXA: NOSavepoints: NO
...
本章介绍专用MySQL存储引擎的用例。
它不包括“InnoDB存储引擎”和“MySQL NDB Cluster 8.0”中涵盖的默认InnoDB存储引擎或NDB存储存储引擎。
对于高级用户,它还包含可插拔存储引擎架构的描述
(请参阅“MySQL存储引擎架构概述”)。
有关商业MySQL Server二进制文件中提供的功能的信息,请参阅MySQL网站上的MySQL 版本。可用的存储引擎可能取决于您使用的MySQL版本。
有关MySQL存储引擎常见问题的答案,请参阅“MySQL 8.0常见问题解答:存储引擎”。
1.MySQL 8.0支持的存储引擎
1.1 InnoDB
MySQL 8.0中的默认存储引擎。InnoDB是MySQL的事务安全(ACID兼容)存储引擎,具有提交、回滚和崩溃恢复功能,可保护用户数据。InnoDB行级锁定(不升级到更粗粒度的锁定)和Oracle风格的一致非锁定读取提高了多用户并发性和性能。InnoDB将用户数据存储在集群索引中,以减少基于主键的常见查询的I/O。为了保持数据完整性,InnoDB还支持FOREIGN KEY引用完整性约束。
有关InnoDB的更多信息,请参阅"InnoDB存储引擎"。
1.2 MyISAM
这些表占用空间很小。表级锁定限制了读/写工作负载的性能,因此它通常用于Web和数据仓库配置中的只读或只读工作负载。
1.3 Memory
将所有数据存储在RAM中,以便在需要快速查找非关键数据的环境中快速访问。这种发动机以前被称为HEAP发动机。其使用案例正在减少;InnoDB及其缓冲池内存区域提供了一种通用且持久的方式来将大部分或所有数据保存在内存中,NDBCLUSTER为巨大的分布式数据集提供了快速的键值查找。
1.4 CSV
它的表实际上是具有逗号分隔值的文本文件。CSV表允许您以CSV格式导入或转储数据,以便与读取和写入相同格式的脚本和应用程序交换数据。因为CSV表没有索引,所以通常在正常操作期间将数据保存在InnoDB表中,并且仅在导入或导出阶段使用CSV表。
1.5 Archive
这些紧凑、无索引的表用于存储和检索大量很少被引用的历史、归档或安全审计信息。
1.6 Blackhole
黑洞存储引擎接受但不存储数据,类似于Unix/dev/null设备。查询总是返回一个空集。这些表可以用于复制配置,其中DML语句被发送到副本服务器,但源服务器不保留自己的数据副本。
1.7 NDB
(也称为NDBCLUSTER)这种集群数据库引擎特别适合于需要尽可能高的正常运行时间和可用性的应用程序。
1.8 Merge
使MySQL DBA或开发人员能够对一系列相同的MyISAM表进行逻辑分组,并将它们作为一个对象引用。适用于VLDB环境,如数据仓库。
1.9 Federated
提供链接独立MySQL服务器的能力,以从多个物理服务器创建一个逻辑数据库。非常适合分布式或数据集市环境。
1.10 Example
此引擎是MySQL源代码中的一个示例,说明了如何开始编写新的存储引擎。它主要是开发者感兴趣的。存储引擎是一个什么都不做的“存根”。您可以使用此引擎创建表,但不能将任何数据存储在表中或从表中检索数据。
2.选择存储引擎
MySQL提供的各种存储引擎在设计时考虑到了不同的用例。下表概述了MySQL提供的一些存储引擎,并在下表中进行了说明。
Feature | MyISAM | Memory | InnoDB | Archive | NDB |
---|---|---|---|---|---|
B-tree索引 | Yes | Yes | Yes | No | No |
备份/时间点恢复(note 1) | Yes | Yes | Yes | Yes | Yes |
集群支持 | No | No | No | No | Yes |
聚集索引 | No | No | Yes | No | No |
压缩数据 | Yes (note 2) | No | Yes | Yes | No |
数据缓存 | No | N/A | Yes | No | Yes |
加密数据 | Yes (note 3) | Yes (note 3) | Yes (note 4) | Yes (note 3) | Yes (note 5) |
外键支持 | No | No | Yes | No | Yes |
全文搜索索引 | Yes | No | Yes (note 6) | No | No |
地理空间数据类型支持 | Yes | No | Yes | Yes | Yes |
地理空间索引支持 | Yes | No | Yes (note 7) | No | No |
哈希索引 | No | Yes | No (note 8) | No | Yes |
索引缓存 | Yes | N/A | Yes | No | Yes |
锁定粒度 | Table | Table | Row | Row | Row |
MVCC | No | No | Yes | No | No |
复制支持(note 1) | Yes | Limited (note 9) | Yes | Yes | Yes |
存储限制 | 256TB | RAM | 64TB | None | 384EB |
T树索引 | No | No | No | No | Yes |
事务 | No | No | Yes | No | Yes |
更新数据字典的统计信息 | Yes | Yes | Yes | Yes | Yes |
note:
1.在服务器中实现,而不是在存储引擎中实现。
2.只有在使用压缩行格式时,才支持压缩的MyISAM表。使用MyISAM压缩行格式的表是只读的。
3.通过加密功能在服务器中实现。
4.通过加密功能在服务器中实现;在MySQL 5.7及更高版本中,支持静态数据加密。
5.通过加密功能在服务器中实现;截至NDB 8.0.22支持加密NDB备份;NDB 8.0.29及更高版本支持透明NDB文件系统加密。
6.MySQL 5.6及更高版本提供了对FULLTEXT索引的支持。
7.MySQL 5.7及更高版本提供了对地理空间索引的支持。
8.InnoDB的自适应哈希索引功能在内部使用哈希索引。