mysql系列之数据引擎

5 阅读2分钟

MySQL 支持多种存储引擎,每种引擎有各自的数据存储方式、锁机制、事务支持等特点。在 MySQL 5.5 之后,默认引擎为 InnoDB,也是目前最常用的生产级引擎。

下面列出几种主流存储引擎及其特点:

引擎事务外键锁粒度主要特点适用场景
InnoDB✅ 支持✅ 支持行级锁ACID 事务、MVCC、聚簇索引、崩溃恢复、高并发大多数 OLTP(在线事务处理)场景,如订单、账户、用户数据
MyISAM❌ 不支持❌ 不支持表级锁读写分离时读性能较好,占用空间小,不支持崩溃安全只读或写极少的历史表、日志分析、数据仓库场景(逐渐被 InnoDB 取代)
Memory❌ 不支持❌ 不支持表级锁数据存储在内存中,重启后丢失,查询极快临时表、缓存表、会话状态等对持久性无要求的场景
CSV❌ 不支持❌ 不支持表级锁将数据以 CSV 格式存储,可直接被外部程序读写作为数据交换格式,或从外部系统导入简单数据
Archive❌ 不支持❌ 不支持行级锁只支持 INSERT 和 SELECT,使用 zlib 压缩,存储空间小日志存储、审计数据等写多读少、无需更新的场景
NDB Cluster✅ 支持✅ 支持(部分)行级锁分布式内存存储,高可用、高吞吐,跨节点同步对高可用性、水平扩展要求极高的电信、金融类应用

如何选择存储引擎?

  1. 首选 InnoDB
    除非有非常明确的特殊需求,否则现代 MySQL 应用都应使用 InnoDB。它能满足事务、数据完整性、高并发、崩溃恢复等绝大多数业务要求。

  2. 何时使用 MyISAM

    • 极少数情况下,如果表完全是只读或只有单线程写入,且对崩溃恢复不敏感,可以使用 MyISAM 获得稍好的读性能。
    • 但在 MySQL 8.0 中,系统表已强制使用 InnoDB,MyISAM 逐渐边缘化。
  3. 临时表场景

    • MySQL 内部会使用 Memory 或 TempTable 引擎处理复杂查询的临时表。
    • 用户也可显式创建 ENGINE=MEMORY 表做缓存,但要注意内存占用和数据易失性。
  4. 特殊数据交换

    • CSV、Archive 等引擎通常作为特定工具使用,而非业务主存储。

引擎管理常用命令

sql

-- 查看当前数据库支持的引擎
SHOW ENGINES;

-- 创建表时指定引擎
CREATE TABLE t1 (id INT) ENGINE = InnoDB;

-- 修改已有表的引擎
ALTER TABLE t1 ENGINE = InnoDB;