1 MySQL存储引擎简介
存储引擎是MySQL用于处理不同表类型的SQL操作的组件。 InnoDB是默认的也是最通用的存储引擎,Oracle建议将其用于表(特殊用例除外)。默认情况下,MySQL 8.0中的CREATE TABLE语句创建InnoDB表。
MySQL Server使用可插拔的存储引擎体系结构,该体系结构使存储引擎可以加载到正在运行的MySQL服务器中或从中卸载。
要确定服务器支持哪些存储引擎,请使用SHOW ENGINES
语句。 “Support”列中的值指示一个引擎是否可用,值可以为:(1)YES:可用;(2)NO:不可用;(3)DEFAULT:引擎可用,并且当前已设置为默认存储引擎。
例如:
mysql> SHOW ENGINES\G
*************************** 1. row ***************************
Engine: PERFORMANCE_SCHEMA
Support: YES
Comment: Performance Schema
Transactions: NO
XA: NO
Savepoints: NO
*************************** 2. row ***************************
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
*************************** 3. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 4. row ***************************
Engine: BLACKHOLE
Support: YES
Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
XA: NO
Savepoints: NO
*************************** 5. row ***************************
Engine: MyISAM
Support: YES
Comment: MyISAM storage engine
Transactions: NO
XA: NO
Savepoints: NO
2 MySQL 8.0支持的存储引擎
存储引擎 | 特征 |
---|---|
InnoDB | MySQL 8.0中的默认存储引擎。 InnoDB是MySQL的事务安全(兼容ACID)存储引擎,具有提交,回滚和崩溃恢复功能来保护用户数据。 InnoDB行级锁(无需升级为更粗粒度的锁定)和Oracle风格的一致非锁定读取可提高多用户并发性和性能。 InnoDB将用户数据存储在聚集索引中,以减少基于主键的常见查询的I / O。为了维护数据完整性,InnoDB还支持FOREIGN KEY引用完整性约束。有关InnoDB的更多信息,请参见The InnoDB Storage Engine。 |
MyISAM | 这些表占用的空间很小。表级锁限制了读/写工作负载中的性能,因此它通常用于Web和数据仓库配置中的只读或绝大部分读工作负载中。 |
Memory(内存) | 将所有数据存储在RAM中,以便在需要快速查找非关键数据的环境中快速访问。该引擎以前称为HEAP引擎。Memory的用例正在减少;具有缓冲池内存区域的InnoDB提供了一种通用且持久的方式来将大多数或所有数据保留在内存中,而NDBCLUSTER提供了针对大型分布式数据集的快速键值查找。 |
CSV | 其表实际上是带有逗号分隔值的文本文件。 CSV表允许您以CSV格式导入或转储数据,以与读取和写入相同格式的脚本和应用程序交换数据。由于CSV表未建立索引,因此通常在正常操作期间将数据保留在InnoDB表中,并且仅在导入或导出阶段使用CSV表。 |
Archive(存档) | 这些紧凑的、未编制索引的表用于存储和检索大量很少参考的历史、存档或安全审核信息。 |
Blackhole | Blackhole存储引擎可以接受但不存储数据,类似于Unix的/dev/null 设备。查询总是返回一个空集。这些表可用于将DML语句发送到从属服务器的复制配置中,但是主服务器不会保留其自己的数据副本。 |
NDB(也称为NDBCLUSTER) | 此群集数据库引擎特别适合于需要尽可能高的正常运行时间和可用性的应用程序。 |
Merge | 使MySQL DBA或开发人员可以在逻辑上对一系列相同的MyISAM表进行分组并将它们作为一个对象引用。适用于VLDB环境,例如数据仓库。 |
Federated | 提供了链接单独的MySQL服务器以从许多物理服务器创建一个逻辑数据库的能力。非常适合于分布式或数据集市环境。 |
Example | 该引擎作为MySQL源代码中的一个示例,说明了如何开始编写新的存储引擎。它主要是开发人员感兴趣的。存储引擎是什么都不做的“stub”。您可以使用此引擎创建表,但是不能将数据存储在表中或从表中检索数据。 |
不限于对整个服务器或架构使用相同的存储引擎。可以为任何表单独指定存储引擎。 例如,一个应用程序可能大部分表使用InnoDB,一个CSV表用于将数据导出到电子表格,而另一些MEMORY表用于临时工作区。
3 如何选择一个存储引擎
MySQL提供的各种存储引擎在设计时都考虑了不同的用例。 下表概述了MySQL提供的一些存储引擎,并在表后提供了一些说明。
特征 | 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 3) |
Foreign key支持 | No | No | Yes | No | Yes (note 5) |
全文搜索索引 | Yes | No | Yes (note 6) | No | No |
地理空间数据类型支持 | Yes | No | Yes | Yes | Yes |
地理空间索引支持 | Yes | No | Yes (note 7) | No | No |
Hash索引 | 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-tree 索引 | No | No | No | No | Yes |
事务 | No | No | Yes | No | Yes |
更新数据字典的统计信息 | Yes | Yes | Yes | Yes | Yes |
说明:
1.在服务器而不是在存储引擎中实现。
2.仅当使用压缩的行格式时,才支持压缩的MyISAM表。 在MyISAM中使用压缩行格式的表是只读的。
3.通过加密功能在服务器中实现。
4.通过加密功能在服务器上实现; 在MySQL 5.7和更高版本中,支持静态数据表空间加密。
- MySQL Cluster NDB 7.3和更高版本提供了对外键的支持。
- MySQL 5.6和更高版本提供了对FULLTEXT索引的InnoDB支持。
- MySQL 5.7和更高版本提供了InnoDB对地理空间索引的支持。
- InnoDB在内部将哈希索引用于其自适应哈希索引功能。
9.详细请参阅官方文档。
网友评论