MySQL 采用插件式存储引擎架构,不同引擎负责数据存储、事务、锁机制、索引等底层逻辑,适配不同业务场景,最常用的是 InnoDB、MyISAM,还有 Memory、Archive、CSV 等专用引擎。
下面将简单介绍 MySQL 中最常用的存储引擎:
MySQL 5.5 版本正式将 InnoDB 替代 MyISAM 作为默认存储引擎,5.6、5.7、8.0 全系列均默认使用 InnoDB,是线上生产环境唯一推荐引擎。
InnoDB 存储引擎的特点:
支持事务(ACID)
支持行级锁
支持外键
支持崩溃恢复
支持MVCC(多版本并发控制)
适用场景:
InnoDB 存储引擎几乎适合所有场景,特别是需要事务支持的业务,也就是为什么业务系统无一例外选择 InnoDB 的原因。
MySQL 5.5 之前,MyISAM 是数据库默认存储引擎;5.5 及之后版本默认改为 InnoDB,生产环境基本淘汰 MyISAM。
MyISAM 存储引起的特点:
不支持事务,致命的硬伤。
表级锁(并发写入性能差)
支持全文索引(InnoDB 5.6+ 也支持了)
数据紧凑,占用空间小(这是一个优点)
适用场景:
MyISAM 存储引起适合读多写少、不需要事务的日志表、全文搜索(现在也可用 Elasticsearch)。
数据存储在内存中,重启后数据丢失。
Memory 存储引擎的特点:
速度极快
不支持 BLOB/TEXT 类型
表级锁
数据不持久化
适用场景:
临时表、缓存表、会话数据
Archive 存储引擎专为只写入、不修改、极少查询的海量日志 / 历史归档数据设计,最大亮点是超高数据压缩率,极致节省磁盘空间。
Archive 存储引擎的特点:
高压缩存储,使用 zlib 逐行压缩写入数据,文本类数据压缩率可达 70%~90%,同等数据量体积远小于 InnoDB、MyISAM。文件结构:
.frm:表结构文件
.arz:压缩数据文件
DML 操作严格限制,仅支持:INSERT、REPLACE、SELECT;不支持:UPDATE、DELETE,无法修改、删除已有数据,写入后永久只读。
锁机制:插入使用行级锁,支持高并发批量写入,不会像 MyISAM 整张表锁住。
索引极强限制,仅允许给 AUTO_INCREMENT 自增列创建索引;其他任何字段都无法建立索引;
适用场景:
系统操作日志、访问日志、审计日志、埋点行为日志;
过期历史流水、归档订单(仅留存备查,不会更新);
传感器采集数据、监控埋点,只写入、极少检索;
合规留存数据,要求长期保存、节约存储成本。
mysql> SHOW ENGINES;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| ndbcluster | NO | Clustered, fault-tolerant tables | NULL | NULL | NULL |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| ndbinfo | NO | MySQL Cluster system information storage engine | NULL | NULL | NULL |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
11 rows in set (0.00 sec)从上面可知,InnoDB 是默认存储引擎,也只有该引擎支持事务。还支持 MEMORY、MyISAM、MRG_MYISAM、BLACKHOLE、CSV 和 ARCHIVE 存储引擎。其中:
MRG_MYISAM:简称 MERGE,本身不存储任何真实数据,是一张虚拟汇总表,作用是把多张结构完全一致的 MyISAM 物理表逻辑合并成一张表统一查询。底层真实数据依然存在各个 MyISAM 分表里,删除 MERGE 虚拟表不会删除原始分表。
BLACKHOLE:顾名思义,黑洞引擎只接收 SQL,不存储任何真实数据。虽然不存本地数据,但所有 DML 语句都会正常写入 binlog,主库执行黑洞表写入,binlog 正常同步到从库,从库可以正常落地数据。
CSV:将表数据直接存储为标准 csv 文本文件,可以用 Excel、WPS、记事本直接打开编辑,主要用于数据库与外部文本数据互通。建表后会生成 3 个同前缀文件:
.frm:表结构定义文件
.CSV:实际数据,逗号分隔文本
.CSM:记录行数、校验信息的元数据文件
下面演示创建一张表,然后再修改表的存储引擎,如下:
-- 创建一张表,使用 MyISAM 存储引擎
mysql> CREATE TABLE myisam_demo (
-> id INT PRIMARY KEY,
-> log TEXT
-> ) ENGINE=MyISAM;
Query OK, 0 rows affected (0.02 sec)
-- 修改表的存储引擎,改为 InnoDB
mysql> ALTER TABLE myisam_demo ENGINE=InnoDB;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
-- 查看表的引擎
mysql> SHOW TABLE STATUS LIKE 'myisam_demo' \G
*************************** 1. row ***************************
Name: myisam_demo
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 0
Avg_row_length: 0
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: 1
Create_time: 2026-07-09 14:33:28
Update_time: NULL
Check_time: NULL
Collation: utf8mb4_0900_ai_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
-- 或者
mysql> SHOW CREATE TABLE myisam_demo \G
*************************** 1. row ***************************
Table: myisam_demo
Create Table: CREATE TABLE `myisam_demo` (
`id` int NOT NULL,
`log` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)如果向了解更多存储引擎的详细知识,需要阅读专业书籍。