mysql的几种存储引擎
MySQL 支持多种存储引擎(Storage Engine),每种引擎都有其特定的设计目标、优势和适用场景。存储引擎决定了表如何存储数据、如何建立索引、是否支持事务、并发控制机制以及数据恢复能力等核心特性。 以下是最常见的几种存储引擎及其关键特性:
1. InnoDB (默认引擎)
核心特性:
ACID 事务支持: 提供完整的提交(Commit)、回滚(Rollback)和崩溃恢复(Crash Recovery)能力,满足数据一致性要求高的场景。
行级锁: 默认使用行级锁,大幅提升多用户并发读写性能,减少锁冲突。
外键约束: 支持 FOREIGN KEY 约束,强制保证表间数据的引用完整性。
MVCC (多版本并发控制): 提供高并发性,非锁定一致性读(在
READ COMMITTED
和REPEATABLE READ
隔离级别下),读操作不阻塞写操作,写操作不阻塞读操作(理想情况下)。聚集索引: 表数据按主键顺序物理存储(主键索引即数据文件),主键查询极快。二级索引叶子节点存储主键值。
Write-Ahead Logging (WAL): 使用 Redo Log 保证事务持久性(Durability),使用 Undo Log 支持事务回滚和 MVCC。
优化缓冲池: 通过 Buffer Pool 在内存中缓存数据和索引,减少磁盘 I/O。
热备份: 支持通过第三方工具(如 Percona XtraBackup)或 MySQL Enterprise Backup 进行非阻塞的在线物理热备份。
适用场景: 绝大多数应用场景的首选,尤其适用于需要事务、高并发、数据一致性要求高、有外键约束或需要在线热备份的场景(如 OLTP 系统、核心业务表)。
2. MyISAM (历史遗留引擎,MySQL 5.5 之前默认)
核心特性:
非事务性: 不支持事务、回滚或崩溃后的安全恢复(可能损坏需要修复)。
表级锁: 进行写操作(INSERT/UPDATE/DELETE)时锁定整个表,并发写性能差,读操作会阻塞写操作(写操作也会阻塞读操作)。
全文索引: 支持 FULLTEXT 索引,适合文本搜索(但 InnoDB 从 5.6 开始也支持)。
高速读: 对于只读或读多写少且对数据一致性要求不高的场景,纯读性能可能快于 InnoDB(尤其在 COUNT(*) 操作上,因为单独存储了行数)。
压缩表: 支持压缩的只读表(
myisampack
),节省空间。存储结构: 每个表存储为三个文件:
.frm
(表定义),.MYD
(MyISAM Data),.MYI
(MyISAM Index)。适用场景:
只读或读频率远高于写频率的应用。
数据仓库或报表数据库中的静态表(可压缩)。
需要全文索引且 MySQL 版本 < 5.6(现在应优先使用 InnoDB 的全文索引)。
重要提示: 由于其缺乏事务、行锁和崩溃安全恢复,在现代应用中已不推荐用于核心业务表。 主要用于兼容旧系统或特定只读场景。
3. Memory (HEAP)
核心特性:
内存存储: 所有数据和索引都存储在内存(RAM)中,速度极快。
非持久性: 服务器重启或崩溃会导致所有数据丢失。表定义(.frm)会保留。
表级锁: 并发写性能有限。
哈希索引 (默认): 默认使用哈希索引,等值查询极快。也支持 B-Tree 索引。
不支持 BLOB/TEXT: 只支持固定长度数据类型(即使是 VARCHAR 也视为 CHAR)。
适用场景:
存储临时数据、会话数据、中间结果集或查找表。
需要极快访问速度且能容忍数据丢失的场景。
替代方案: 通常更推荐使用 Redis、Memcached 等专门的内存数据库,或 MySQL 的
tmp_table_size
/max_heap_table_size
配置管理的内部临时表(在内存不足时可能转储到磁盘)。
4. Archive
核心特性:
高压缩: 专为存储和检索大量很少引用的历史、归档或审计数据设计,压缩率非常高。
只写/读优化: 支持
INSERT
和SELECT
,不支持UPDATE
、DELETE
、REPLACE
。 支持行级锁(仅在插入时)。顺序访问: 数据在插入时被压缩,查询时需要全表扫描解压,适合顺序读取。
适用场景: 日志记录、审计跟踪、历史数据存储等需要极致压缩且几乎只追加(Append-only)、很少查询的场景。
5. CSV
核心特性:
纯文本存储: 数据以逗号分隔值(CSV)格式存储在纯文本文件中(
.CSV
文件)。无索引: 不支持索引,查询需全表扫描。
直接编辑: 可以直接用文本编辑器编辑 .CSV 文件,数据库外部的程序也能轻松读写。
适用场景: 数据交换(导入/导出),需要外部程序直接读写数据库文件内容的简单应用。
6. Blackhole
核心特性:
"黑洞"引擎: 接收数据(执行 INSERT 等语句)但不实际存储任何数据。查询总是返回空集。
日志/复制: 主要用途是作为复制链中的中继(过滤不需要的语句)或用于记录语句日志(binlog 会记录,但表本身无数据)。
适用场景: 高级复制配置、基准测试(测量语句处理开销本身)。
7. NDB (NDBCLUSTER)
核心特性:
分布式内存集群: MySQL Cluster 的核心引擎,数据分布在多个数据节点上(可内存存储或磁盘存储),提供高可用性和线性扩展性。
高可用性与冗余: 数据自动分片(Sharding)和同步复制,无单点故障。
实时性: 设计用于需要高吞吐量、低延迟、99.999% 可用性的场景。
复杂架构: 部署、管理和配置相对复杂。
适用场景: 电信、实时金融、需要极高可用性和横向扩展能力的应用(如用户数据库、会话存储)。
8. Federated
核心特性:
"链接表": 本身不存储数据。当在 Federated 表上查询时,会从远程 MySQL 数据库上的某个表拉取数据。
性能开销: 每次访问都涉及网络请求,性能通常较差。
适用场景: 偶尔需要透明访问远程 MySQL 表数据的场景(现代更推荐使用数据库链接或 API 集成)