mysql 引擎概述

码农老张 后端 数据库 2024-10-30

mysql 引擎概述

1. 什么是Mysql 引擎

存储引擎是Mysql的组件,用于处理Mysql不同类型的表操作。Innodb是默认的,最普遍的存储引擎,oracel建议建表时候建议使用除非有特殊需求(create table语法在Mysql5.7中默认创建的是一个Innodb引擎的表)

Mysql服务使用可拔插的存储引擎架构,可以灵活在一个运行的Mysql中进行加载和卸载存储引擎。

为了确定你的存储引擎能够支持的存储引擎,你能够使用 show engines语句进行查询。支持列中的值标识是否可以使用某个引擎,值为yes,no,default 表示这个引擎可用,不可用,默认可用。

2. show egines结果示例

ENGINESUPPORTCOMMENTTRANSACTIONSXASAVEPOINTS
InnodbDEFAULTSupports transactions, row-level locking, and foreign keysYESYESYES
Mrg_MyisamYESCollection of identical Myisam tablesNONONO
MemoryYESHash based, stored in Memory, useful for temporary tablesNONONO
BLlackholeYES/dev/null storage engine (anything you write to it disappears)NONONO
MyisamYESMyisam storage engineNONONO
CsvYESCsv storage engineNONONO
ArchiveYESArchive storage engineNONONO
Performance_SchemaYESPerformance SchemaNONONO
FederatedNOFederated Mysql storage engine

3. Mysql5.7支持的存储引擎

  • InnoDB:: 是Mysql5.7默认的执行引擎,是一个事务安全(符合acid标准)存储引擎,有提交,回滚,容灾恢复的能力来保护用户数据。Innodb行锁(无需升级到更粗粒度锁)和oracle风格一只无锁定读取可以提高多用户性能。Innodb将用户数据存储在聚类索引中,以减少基于主键的普通查询的I/O。 为了维护数据完整性,Innodb 还支持 FOREIGN KEY 参考完整性约束。
  • MyISAM::这些表占用空间小。 表级锁定限制了读/写工作负载的性能,因此通常用于 Web 和数据仓库配置中的只读或最多读取的工作负载。
  • Memory:将所有数据存储在内存中,以便在需要快速查找非关键数据的环境中快速访问。 该引擎以前被称为 HEAP 引擎。 它的用例在不断减少;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 源代码中的一个示例,说明了如何开始编写新的存储引擎。 开发人员主要对它感兴趣。 存储引擎是一个什么都不做的 "存根"。 您可以使用该引擎创建表格,但不能在其中存储数据,也不能从中检索数据。

在整个服务器或模式中使用相同的存储引擎并不受限制。 您可以为任何表指定存储引擎。 例如,应用程序可能主要使用 Innodb 表,还有一个 Csv 表用于将数据导出到电子表格,以及一些 Memory 表用于临时工作区。

4.引擎适用场景

Mysql 提供的各种存储引擎在设计时考虑了不同的使用情况。 下表概述了 Mysql 提供的一些存储引擎,表后附有说明。

FeatureMyisamMemoryInnodbArchiveNdb
B-tree indexesYesYesYesNoNo
Backup/point-in-time recovery (note 1)YesYesYesYesYes
Cluster database supportNoNoNoNoYes
Clustered indexesNoNoYesNoNo
Compressed dataYes (note 2)NoYesYesNo
Data cachesNoN/AYesNoYes
Encrypted dataYes (note 3)Yes (note 3)Yes (note 4)Yes (note 3)Yes (note 5)
Foreign key supportNoNoYesNoYes
Full-text search indexesYesNoYes (note 6)NoNo
Geospatial data type supportYesNoYesYesYes
Geospatial indexing supportYesNoYes (note 7)NoNo
Hash indexesNoYesNo (note 8)NoYes
Index cachesYesN/AYesNoYes
Locking granularityTableTableRowRowRow
MVCCNoNoYesNoNo
Replication support (note 1)YesLimited (note 9)YesYesYes
Storage limits256TBRAM64TBNone384EB
T-tree indexesNoNoNoNoYes
TransactionsNoNoYesNoYes
Update statistics for data dictionaryYesYesYesYesYes
  1. 某些功能是在 Mysql 服务器级别实现的,而不是在具体的存储引擎(如 Innodb 或 Myisam)中处理的。即这些功能和数据库的底层存储引擎无关,直接在数据库服务器中实现。
  2. 使用 Myisam 存储引擎时,支持压缩表格,但仅在行格式为压缩行时支持。需要注意的是,压缩格式下的 Myisam 表是只读的,无法进行写操作。
  3. 加密功能是通过服务器提供的加密函数实现的,而不是存储引擎本身提供的。这意味着不依赖具体存储引擎,Mysql 服务器本身提供加密相关的功能。
  4. 加密功能通过服务器的加密函数来实现。从 Mysql 5.7 版本开始,Mysql 支持静态数据加密(Data-at-Rest Encryption),即数据库文件中的静态数据可以被加密。
  5. Ndb 存储引擎(Mysql Cluster 使用的存储引擎),从 Ndb 8.0.22 开始支持加密备份。从 Ndb 8.0.29 开始,支持透明的 Ndb 文件系统加密
  6. 全文索引(FULLTEXT Indexes) 是在 Mysql 5.6 及更高版本中支持的。它用于对大文本字段进行全文检索,可以快速进行复杂的文本查询(如模糊查询)。
  7. 地理空间索引(Geospatial Indexing) 是在 Mysql 5.7 及以后版本中支持的。这种索引用于处理和查询地理空间数据(如地理坐标),常用于 GIS 应用。
  8. Innodb 存储引擎内部使用了哈希索引(Hash Index),作为其自适应哈希索引(Adaptive Hash Index)功能的一部分。自适应哈希索引是 Innodb 的一种性能优化机制,能自动创建哈希索引以加速某些类型的查询。

5.总结

  • Mysql支持各种各样的引擎供我们建表选择 5.7版本默认使用的是Innodb引擎
  • Innodb引擎由于良好的容错恢复支持,事务,行锁,索引支持成为最普遍的引擎
  • show egines查看当前版本支持的引擎
  • 不同业务场景可能有适合自己的引擎 需要根据每个引擎的特性灵活选择


转载来源:https://juejin.cn/post/7418717006973304871

Apipost 私有化火热进行中

评论