MySQL Database Engines - tenji/ks GitHub Wiki

MySQL 常用数据库引擎

数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL 的核心就是存储引擎

一、InnoDB

InnoDB 是 DBMS MySQL 和 MariaDB 的存储引擎。它在 MySQL 5.5 及更高版本取代 MyISAM 成为默认引擎。

1.1 优点

  • 支持 ACID(原子性、一致性、隔离性和持久性)属性,以保护用户数据;
  • 支持使用外键,有助于一致的更新、插入和删除操作。此外,它还有助于维护数据库表内容的完整性;
  • 支持崩溃修复和自增列。

1.2 缺点

  • 如果性能是优先考虑的,那么就不会使用它,因为它比 MyISAM 慢,读写效率较差、占用的数据空间较大;
  • 外键关系的使用使得使用变得复杂。

注:存储引擎 InnoDB 存储相同的数据需要的空间比 MyISAM 大,这是因为 MyISAM 对数据进行了压缩。

1.3 索引类型(Index Type)

  • BTREE

1.4 适用场景

InnoDB 提供了 ACID 事务支持和行级锁,适用于高并发的写入操作和数据安全性要求较高的应用。它适合 OLTP(在线事务处理)场景,并提供了事务隔离级别的控制。

关于 OLTP,传送门

二、MyISAM

它是 MySQL DBMS 5.5 之前版本的默认引擎。MyISAM 是一种高速存储和检索存储引擎。它不支持事务,不支持行级锁。它很容易在系统之间复制,并且数据占用空间小。主要用于 Web 和数据仓库。

2.1 特性

  • MyISAM 存储在 3 个文件中:.frm – 存储表结构,.MYD – 数据文件,.MYI – 索引文件;
  • MyISAM 支持三种存储格式:固定/静态(Fixed)、动态(Dynamic)和压缩(Compressed)。
    • 静态表:表中的字段都是非变长字段,这样每个记录都是固定长度的。优点存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多。
    • 动态表:记录不是固定长度的,这样存储的优点是占用的空间相对较少。缺点是频繁的更新、删除数据容易产生碎片,需要定期执行 OPTIMIZE TABLE 或者 myisamchk-r 命令来改善性能。
    • 压缩表:因为每个记录是被单独压缩的,所以只有非常小的访问开支。
  • 每个表的最大索引数和每个索引的最大列数分别为 64 和 16。

2.2 优点

  • MyISAM 比其他引擎更简单;
  • MyISAM 引擎保存了单独的索引文件 .myi,且它的索引是直接定位到 OFFSET 的,读取效率较高,占用数据空间较少。

2.3 缺点

  • 不支持事务、不支持行级锁、不支持外键,因此写入效率低。

2.4 索引类型(Index Type)

  • BTREE
  • RTREE

2.5 适用场景

MyISAM 不支持事务和行级锁,适合于读操作较多、写操作较少的场景,如数据仓库日志分析

三、MEMORY

它被认为是通常用于在内存中创建临时表(也称为 HEAP)的最快引擎。因此,当数据库重新启动时,数据会丢失。它不支持事务。它将所有数据存储在 RAM 中以便更快地访问,而不是将数据存储在磁盘中。它广泛用于表数据的只读缓存或临时使用。

3.1 优点

  • MEMORY 读写性能很高;
  • MEMORY 支持 Hash 索引或 B 树索引,其中 Hash 索引(默认)是基于 key 查询的,因此查询效率特别高。(但是如果是基于范围查询的效率就比较低了)

3.2 缺点

  • MEMORY 表无法分区;
  • 如果从 MEMORY 表中删除单独的行,则无法回收内存。

3.3 索引类型(Index Type)

  • HASH
  • BTREE

3.4 适用场景

Memory 引擎将数据存储在内存中,读写速度非常快,但在数据库服务重启时数据将丢失。它适用于临时数据存储和高效的缓存操作,如会话管理缓存表

∞、参考链接