InnoDB(默认引擎,MySQL 5.5+)
核心特点
事务安全:支持 ACID,具备提交、回滚和崩溃恢复能力
行级锁:高并发场景下锁粒度更细,性能更优
外键约束:支持 FOREIGN KEY,保证数据完整性
MVCC:多版本并发控制,实现非锁定读
限制
单表最大 64TB
写性能略低于 MyISAM(因维护事务日志)
占用更多磁盘空间(数据 + 索引 + Undo/Redo)
实现原理
存储结构:
table.frm # 表结构定义 table.ibd # 数据 + 索引(聚簇索引) ibdata1 # 共享表空间(系统数据字典、Undo log) ib_logfile0 # Redo log(重做日志,保证 crash-safe)核心机制
聚簇索引:数据文件和主键索引合并存储,主键查询无需回表
Buffer Pool:内存缓冲池,缓存热点数据页(推荐设置物理内存的 70%)
WAL 机制:先写 Redo log 再写磁盘,确保宕机不丢数据
Undo log:存储旧版本数据,用于回滚和 MVCC 快照读
性能监控
-- Buffer Pool 命中率(应 > 99%)SHOWSTATUSLIKE'Innodb_buffer_pool_read_requests';SHOWSTATUSLIKE'Innodb_buffer_pool_reads';MyISAM(MySQL 5.5 之前默认)
核心特点
访问速度极快:无事务开销,COUNT(*) 无需扫描全表(有计数器)
表级锁:写操作会锁整张表,不适合高并发写入
全文索引:早期支持全文搜索(InnoDB 5.6+ 也支持)
数据压缩:支持 myisampack 压缩,节省空间
限制
不支持事务:无法保证 ACID
不支持外键:无约束检查
不支持崩溃恢复:表损坏后需手动修复
单表最大 256TB(但实际生产建议 < 1 亿行)
实现原理
存储结构:
table.frm # 表结构 table.MYD # MYData,存储数据 table.MYI # MYindex,存储索引核心机制
非聚簇索引:索引文件和数据文件分离,索引叶子节点存储数据地址
表锁:写操作(INSERT/UPDATE/DELETE)会锁定整个表
计数器优化:维护总行数,COUNT(*) 时间复杂度 O(1)
数据组织
静态表:定长记录,默认格式,速度快但空间利用率低
动态表:变长记录,支持 VARCHAR/BLOB,但会产生碎片
压缩表:只读,空间占用最小,访问需解压
表损坏修复
myisamchk -r table.MYI # 修复索引 CHECK TABLE table; # SQL 方式检查 REPAIR TABLE table; # SQL 方式修复适用场景
只读或读多写少的静态数据(如历史报表、字典表)
MEMORY(内存引擎)
核心特点
数据存内存:读写速度极快(比 Redis 慢,但支持 SQL)
HASH 索引:默认哈希索引,等值查询 O(1)
表级锁:并发写入性能受限
数据易失:服务重启后数据丢失
限制
单表最大大小:受 max_heap_table_size 限制(默认 16MB)
不支持 TEXT/BLOB:无法存储大对象
不支持持久化:必须自行备份或从源表恢复
不支持事务:无 ACID 保障
实现原理
存储结构:
table.frm # 仅存储表结构 # 数据存储在内存中,无磁盘文件核心机制
内存分配:使用内存堆(Heap)存储数据行
索引类型:支持 HASH 和 BTREE 索引
数据生命周期:服务关闭自动清空,可通过 --init-file 加载初始数据
使用场景
临时表(CREATE TEMPORARY TABLE)
频繁访问的代码表(如状态码、配置项)
中间计算结果(GROUP BY 临时聚合)
-- 创建 MEMORY 表CREATETABLEcache(idINTPRIMARYKEY,valueVARCHAR(100))ENGINE=MEMORY MAX_ROWS=100000;MERGE(MyISAM 集合)
特点
将多个结构相同的 MyISAM 表逻辑合并为一个表
突破单表大小限制,支持分布式 IO
只能合并 MyISAM 表,不能合并 InnoDB
限制
不支持事务
只能对映射的表进行查询/删除/更新,不能进行 DROP
各子表必须结构完全一致
适用场景
数据仓库的日志分表查询
其他存储引擎简介
CSV
纯文本 CSV 格式,可用 Excel 打开;不支持索引、事务
ARCHIVE
高压缩比,仅支持 INSERT/SELECT;适合历史日志
BLACKHOLE
写入的数据立即丢弃,仅记录 Binlog;用于复制中继
FEDERATED
访问远程 MySQL 表,性能差;已废弃
NDB Cluster
MySQL 官方集群方案,支持自动分片;配置复杂,用得少
PERFORMANCE_SCHEMA
MySQL 5.5+ 内置,存储性能数据,不存储业务数据
存储引擎对比总览
特性对比
| 特性 | InnoDB | MyISAM | MEMORY | MERGE | ARCHIVE |
|---|---|---|---|---|---|
| 事务支持 | ✅ YES | ❌ NO | ❌ NO | ❌ NO | ❌ NO |
| 锁粒度 | 行锁 | 表锁 | 表锁 | 表锁 | 行锁(伪) |
| 外键 | ✅ YES | ❌ NO | ❌ NO | ❌ NO | ❌ NO |
| 索引类型 | B+Tree | B+Tree | HASH/BTREE | B+Tree | 无 |
| 最大容量 | 64TB | 256TB | 内存限制 | 无上限 | 无上限 |
| COUNT(*) 性能 | 慢(全表扫描) | 极快(有计数器) | 快(内存) | 快 | 慢 |
| FULLTEXT 索引 | ✅ 5.6+ | ✅ YES | ❌ NO | ❌ NO | ❌ NO |
| 数据压缩 | ❌ 仅表空间压缩 | ✅ YES | ❌ NO | ❌ NO | ✅ 极高 |
| 崩溃恢复 | ✅ YES | ❌ NO | ❌ NO | ❌ NO | ❌ NO |
| 存储限制 | 数据 + 索引 | .MYD + .MYI | 内存 | 多个 MyISAM | 追加写入 |
| 适用场景 | 通用事务型业务 | 只读/日志型业务 | 临时表、缓存表 | 数据仓库分表 | 冷数据归档 |
选型决策树
需要事务支持? ├── 是 → InnoDB(99% 场景) │ 需要全文索引? ├── 是 → InnoDB 5.6+ 或 MyISAM │ 数据量是否巨大(> 1亿行)? ├── 否 → InnoDB │ 是否只读/读多写少? ├── 是 → MyISAM(但要考虑数据恢复成本) │ 是否需要内存级速度? ├── 是 → MEMORY(临时数据) │ 是否需要归档? ├── 是 → ARCHIVE │ 其他特殊场景 → CSV/BLACKHOLE/NDB核心配置建议
InnoDB 优化配置
[mysqld] # 内存缓冲池(最关键,设为物理内存的 70%) innodb_buffer_pool_size = 8G # 独立表空间(便于管理) innodb_file_per_table = 1 # Redo log 大小(影响刷盘频率) innodb_log_file_size = 512M # 刷盘策略(1=最安全,0/2=性能更高) innodb_flush_log_at_trx_commit = 1MyISAM 优化配置
# 索引缓冲区 key_buffer_size = 512M # 表缓存(减少文件打开关闭) table_open_cache = 2000 # 修复时排序缓冲区 myisam_sort_buffer_size = 64M总结
InnoDB 是 99% 场景的答案:支持事务、行锁、崩溃恢复,是 MySQL 5.5 之后的默认引擎,也是互联网企业的标准选择。MyISAM 和 MEMORY 仅在特定场景(只读表、临时表)下使用,其他引擎多为特殊用途。