MySQL 表的存储引擎

🎉摘要:本文详细解析MySQL插件式存储引擎架构,重点介绍InnoDB(默认引擎,支持事务、行级锁、外键)、MyISAM(读多写少)、Memory(内存表)和Archive(高压缩归档)等核心引擎的特性、优缺点及适用场景,并说明如何查看和修改存储引擎,帮助开发者根据业务需求选择合适的引擎。

MySQL 采用插件式存储引擎架构,不同引擎负责数据存储、事务、锁机制、索引等底层逻辑,适配不同业务场景,最常用的是 InnoDB、MyISAM,还有 Memory、Archive、CSV 等专用引擎。

下面将简单介绍 MySQL 中最常用的存储引擎:

InnoDB(默认引擎)

MySQL 5.5 版本正式将 InnoDB 替代 MyISAM 作为默认存储引擎,5.6、5.7、8.0 全系列均默认使用 InnoDB,是线上生产环境唯一推荐引擎。

InnoDB 存储引擎的特点:

  • 支持事务(ACID)

  • 支持行级锁

  • 支持外键

  • 支持崩溃恢复

  • 支持MVCC(多版本并发控制)

适用场景:

InnoDB 存储引擎几乎适合所有场景,特别是需要事务支持的业务,也就是为什么业务系统无一例外选择 InnoDB 的原因。

  

MyISAM 存储引擎

MySQL 5.5 之前,MyISAM 是数据库默认存储引擎;5.5 及之后版本默认改为 InnoDB,生产环境基本淘汰 MyISAM。

MyISAM 存储引起的特点:

  • 不支持事务,致命的硬伤。

  • 表级锁(并发写入性能差)

  • 支持全文索引(InnoDB 5.6+ 也支持了)

  • 数据紧凑,占用空间小(这是一个优点)

适用场景: 

MyISAM 存储引起适合读多写少、不需要事务的日志表、全文搜索(现在也可用 Elasticsearch)。

   

Memory 存储引擎

数据存储在内存中,重启后数据丢失。

Memory 存储引擎的特点:

  • 速度极快

  • 不支持 BLOB/TEXT 类型

  • 表级锁

  • 数据不持久化

适用场景:

临时表、缓存表、会话数据

 

Archive 存储引擎

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)

如果向了解更多存储引擎的详细知识,需要阅读专业书籍。

  

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号