MySQL 存储引擎对比
TIP
MySQL 支持多种存储引擎,最常用的是 InnoDB 和 MyISAM。了解它们的区别对表设计很重要。
InnoDB vs MyISAM
| 对比项 | InnoDB | MyISAM |
|---|---|---|
| 事务支持 | ✓ | ✗ |
| 行级锁 | ✓ | ✗ |
| 外键 | ✓ | ✗ |
| 全文索引 | ✓(5.6+) | ✓ |
| 数据缓存 | ✓(Buffer Pool) | ✗ |
| 表空间 | .ibd | .MYD + .MYI |
| 崩溃恢复 | ✓ | ✗(需 repair) |
| 默认使用 | MySQL 5.5+ 默认 | MySQL 5.5 之前默认 |
存储结构
sql
-- InnoDB:一个表一个 ibd 文件
user.ibd -- 包含数据和索引
-- MyISAM:三个文件
user.frm -- 表结构
user.MYD -- 数据文件
user.MYI -- 索引文件查看存储引擎
sql
-- 查看支持的引擎
SHOW ENGINES;
-- 查看表的引擎
SHOW CREATE TABLE user;
SHOW TABLE STATUS WHERE Name = 'user';
-- 创建时指定引擎
CREATE TABLE log (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
message TEXT
) ENGINE=InnoDB;
-- 修改引擎
ALTER TABLE log ENGINE=MyISAM;选择建议
sql
-- ✅ 使用 InnoDB 的场景
-- 大部分业务表:需要事务、外键、行级锁
CREATE TABLE `order` (
id BIGINT PRIMARY KEY,
user_id BIGINT NOT NULL,
amount DECIMAL(10,2),
status TINYINT,
created_at DATETIME,
INDEX idx_user_id(user_id)
) ENGINE=InnoDB;
-- ✅ 使用 MyISAM 的场景
-- 只读表、日志表、数据仓库(MySQL 5.7 之前)
CREATE TABLE access_log (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
ip VARCHAR(15),
url VARCHAR(255),
visited_at DATETIME
) ENGINE=MyISAM;TIP
MySQL 5.5 之后建议全部使用 InnoDB。如果对性能有极致要求,可以考虑使用其他 NoSQL 或分析型数据库。