MySQL的存储引擎是底层负责数据存储和提取的组件,不同的存储引擎有着不同的设计目标,适配不同的业务场景。了解各存储引擎的特性是做好选型的基础。

主流MySQL存储引擎特性对比
目前MySQL最常用的存储引擎是InnoDB和MyISAM,此外还有Memory、Archive等小众引擎,下面是核心特性的对比:
| 特性 | InnoDB | MyISAM | Memory |
|---|---|---|---|
| 事务支持 | 支持ACID事务 | 不支持 | 不支持 |
| 锁机制 | 行级锁 | 表级锁 | 表级锁 |
| 外键支持 | 支持 | 不支持 | 不支持 |
| 全文索引 | 支持(5.6+版本) | 支持 | 不支持 |
| 数据存储方式 | 聚簇索引存储 | 非聚簇索引,数据文件和索引文件分离 | 内存存储 |
| 崩溃恢复能力 | 强,支持redo log和undo log | 弱,崩溃后可能需要修复表 | 无,重启后数据丢失 |
各存储引擎适用场景
InnoDB适用场景
InnoDB是MySQL 5.5之后的默认存储引擎,适合绝大多数需要事务支持、高并发读写的业务场景:
- 电商订单系统、支付系统,需要事务保证数据一致性
- 用户账户系统,涉及余额变动等敏感操作
- 高并发的读写场景,行级锁可以减少锁冲突
- 需要外键约束保证数据关联性的业务
MyISAM适用场景
MyISAM的读性能较好,但是不支持事务和行级锁,适合读多写少、不需要事务的场景:
- 日志存储系统,主要是插入和查询操作,几乎没有更新删除
- 静态数据存储,比如城市编码表、配置表,数据很少变动
- 全文检索场景,如果使用的MySQL版本低于5.6,InnoDB不支持全文索引时可以选择MyISAM
Memory适用场景
Memory引擎将数据存储在内存中,读写速度极快,但是重启后数据会丢失,适合临时数据存储:
- 临时缓存表,存储查询中间结果
- 会话数据存储,不需要持久化的临时信息
存储引擎的查看与修改
查看表的存储引擎
可以通过SHOW TABLE STATUS命令查看指定表的存储引擎:
-- 查看test表的存储引擎信息 SHOW TABLE STATUS LIKE 'test'G
执行结果中的Engine字段就是该表使用的存储引擎。
创建表时指定存储引擎
创建表的时候可以通过ENGINE参数指定存储引擎:
-- 创建InnoDB引擎的表
CREATE TABLE user_order (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
order_amount DECIMAL(10,2) NOT NULL,
create_time DATETIME NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 创建MyISAM引擎的表
CREATE TABLE config_info (
id INT PRIMARY KEY AUTO_INCREMENT,
config_key VARCHAR(50) NOT NULL,
config_value VARCHAR(200) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
修改已有表的存储引擎
如果已经创建了表,需要修改存储引擎,可以使用ALTER TABLE语句:
-- 将test表的存储引擎修改为InnoDB ALTER TABLE test ENGINE=InnoDB;
注意修改存储引擎会锁表,并且如果表数据量很大,执行时间会比较长,建议在业务低峰期操作。
选型核心建议
如果没有特殊的业务需求,优先选择InnoDB存储引擎,它是目前MySQL生态下通用性最强的引擎,能够满足大部分业务的需求。如果业务是纯读场景、不需要事务,并且数据量不大,可以考虑MyISAM。如果是临时数据存储,再选择Memory引擎。选型的时候不要盲目追求某一项性能指标,要结合业务的事务需求、并发量、数据持久化要求综合判断。