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