文章中如果有图看不到,可以点这里去 csdn 看看。从那边导过来的,文章太多,没法一篇篇修改好。

MySQL 存储引擎 对比(InnoDB vs MyISAM vs Memory)

1. 基础特性

特性InnoDBMyISAMMemory
事务支持✅ 完整 ACID 支持(Redo/Undo/两阶段提交)❌ 不支持❌ 不支持
存储介质磁盘(页式存储)磁盘(表级数据文件 + 索引文件)内存
锁机制行级锁(支持 MVCC,多版本并发控制)表级锁(读写互斥)表级锁
崩溃恢复✅ 支持,基于 Redo/Undo 日志❌ 崩溃后容易丢失数据❌ 数据随进程终止丢失
外键约束✅ 支持❌ 不支持❌ 不支持
全文索引✅(MySQL 5.6+)
空间索引 (GIS)✅(MySQL 5.7+)
数据持久化✅ 磁盘✅ 磁盘❌ 内存(可选择磁盘临时存储)

2. 存储模型 & 文件结构

  • InnoDB

    • 数据以 页(16KB 默认) 为单位存储。
    • 表和索引存储在 共享表空间(ibdata)或独立表空间(.ibd 文件)
    • 聚簇索引(Clustered Index):主键索引即数据本身,辅助索引存储主键引用。
  • MyISAM

    • 数据文件 .MYD 与索引文件 .MYI 分离。
    • 非聚簇索引(索引与数据物理分离),索引叶子节点存放数据地址。
    • 适合顺序扫描与只读型业务。
  • Memory

    • 数据存放在内存中,结构由 哈希索引BTREE 索引 支持。
    • 数据随 MySQL 进程关闭而消失(除非复制到磁盘临时文件)。

3. 索引实现

特性InnoDBMyISAMMemory
主键索引聚簇索引(主键即数据)非聚簇(索引指向数据文件地址)可选 HASH / BTREE
辅助索引存储主键作为二级索引指针存储物理地址存储行指针
全文索引支持(5.6+)支持不支持
空间索引支持(R-Tree,5.7+)支持不支持

4. 缓存机制

  • InnoDB

    • Buffer Pool:缓存数据页、索引页、Undo 页。
    • Adaptive Hash Index (AHI):热数据自适应建立哈希索引。
    • Redo Log Buffer:持久化前写入。
  • MyISAM

    • Key Cache:仅缓存索引,不缓存数据。
    • 数据访问依赖操作系统文件缓存(Page Cache)。
  • Memory

    • 所有数据在内存中,直接访问,无需磁盘 I/O。
    • 速度极快,但数据不持久。

5. 并发控制与锁机制

  • InnoDB

    • 行级锁,支持 MVCC(多版本并发控制)
    • 事务隔离级别:READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ(默认)、SERIALIZABLE。
    • 支持 死锁检测与回滚
  • MyISAM

    • 表级锁,写时锁表,读写互斥。
    • 并发性能差,适合读多写少场景。
  • Memory

    • 表级锁,类似 MyISAM。
    • 高速,但写操作竞争严重。

6. 崩溃恢复

  • InnoDB

    • WAL(Write Ahead Logging)机制:先写 Redo Log,再写数据文件。
    • 崩溃后通过 Redo + Undo 恢复一致性。
  • MyISAM

    • 仅保存数据文件和索引文件,无日志。
    • 崩溃可能导致索引损坏,需 myisamchk 修复。
  • Memory

    • 崩溃即数据丢失,仅保留表结构。

7. 适用场景

  • InnoDB

    • 高并发、需要事务保障的 OLTP 系统(如电商、金融)。
    • 大部分 MySQL 应用首选。
  • MyISAM

    • 读多写少的 OLAP、报表、全文搜索。
    • 对事务要求不高但读性能优先。
  • Memory

    • 高速缓存表、中间计算结果存储。
    • 临时表或会话级缓存。

8. 总结类比

  • InnoDB = 企业级数据库核心(事务安全 + 并发高 + 数据完整性强)。
  • MyISAM = 只读型/分析型利器(快速查询,但写和恢复弱)。
  • Memory = 内存级缓存引擎(极致速度,但无持久性)。
    在这里插入图片描述
posted @ 2025-09-25 17:38  NeoLshu  阅读(9)  评论(0)    收藏  举报  来源