MySQL进阶知识点(六)---- 存储引擎
一、 MySQL 体系结构
为了更好地理解存储引擎,首先需要了解 MySQL 的总体架构,可以分为四层:
层级 | 组件 | 说明 |
---|---|---|
连接层 | 连接池、身份验证 | 负责客户端连接管理、权限认证等 |
服务层 | SQL接口、解析器、优化器、查询缓存 | 负责SQL语句的解析、优化、以及内置函数、触发器等 |
引擎层 | 可插拔存储引擎 | 核心! 负责数据的存储和提取。服务器通过API与存储引擎通信 |
存储层 | 文件系统、日志 | 将数据存储在硬盘上,包括redo log、undo log、数据文件等 |
核心思想:MySQL 的架构设计使得其存储引擎层是可插拔的。这意味着你可以为不同的表选择不同的存储引擎,以适应各种应用场景。
二、 存储引擎简介
1. 什么是存储引擎?
存储引擎是数据库底层软件组件,它规定了数据如何存储、如何索引、如何更新和查询。不同的存储引擎提供不同的功能和特性。
2. 查看支持的存储引擎
SHOW ENGINES;
3. 查看/修改表的存储引擎
-- 查看某张表的存储引擎
SHOW CREATE TABLE table_name;-- 创建表时指定存储引擎
CREATE TABLE table_name (...) ENGINE=InnoDB;-- 修改已存在表的存储引擎
ALTER TABLE table_name ENGINE=MyISAM;
三、 存储引擎特点
MySQL 支持多种存储引擎,其中最主流的是 InnoDB 和 MyISAM。
InnoDB (MySQL 5.5.8 后成为默认存储引擎)
特性 | 描述 |
---|---|
事务支持 | ✅ 支持 ACID 事务,具有提交(commit)和回滚(rollback)能力 |
外键约束 | ✅ 支持 外键约束,保证数据完整性 |
锁机制 | 🔒 行级锁,支持并发写入,大大减少锁冲突,适合高并发 |
崩溃恢复 | ✅ 通过 redo log 和 undo log 提供优秀的崩溃恢复能力 |
存储方式 | 所有表和数据存储在表空间中(如 ibdata1 文件),或按表文件存储(innodb_file_per_table=ON ) |
MVCC | ✅ 支持多版本并发控制,提高并发读写性能 |
适用场景:
需要事务支持(如银行转账、订单系统)
高并发读写(行级锁优势明显)
需要外键约束来保证数据完整性
绝大多数 OLTP (联机事务处理) 应用
MyISAM (MySQL 5.5 之前的默认引擎)
特性 | 描述 |
---|---|
事务支持 | ❌ 不支持 |
外键约束 | ❌ 不支持 |
锁机制 | 🔒 表级锁,并发写入性能差(读锁和写锁是互斥的) |
崩溃恢复 | ❌ 较差 |
存储方式 | 每个表在磁盘上存储为三个文件:.frm (表结构)、.MYD (数据)、.MYI (索引) |
全文索引 | ✅ 支持(在早期版本中是优势) |
压缩性 | ✅ 支持压缩表,适合只读数据 |
适用场景:
只读或读多写少的应用
不需要事务
数据仓库、报表系统等查询密集型且对数据一致性要求不高的场景
其他存储引擎简要对比
引擎 | 主要特点 | 适用场景 |
---|---|---|
Memory | 数据存储在内存中,速度极快;服务器重启后数据丢失 | 缓存、临时表、会话存储 |
Archive | 只支持INSERT和SELECT,高压缩比 | 日志记录、数据归档 |
CSV | 以CSV格式存储数据 | 数据交换 |
四、 InnoDB vs MyISAM 核心区别总结
对比项 | InnoDB | MyISAM |
---|---|---|
事务 | ✅ 支持 | ❌ 不支持 |
外键 | ✅ 支持 | ❌ 不支持 |
锁级别 | 行级锁 | 表级锁 |
并发性能 | 高(写操作) | 低(写操作) |
崩溃恢复 | ✅ 安全,支持 | ❌ 不安全 |
全文索引 | ✅ MySQL 5.6+ 支持 | ✅ 支持(早期版本优势) |
存储文件 | .frm + ibdata1 / .ibd | .frm + .MYD + .MYI |
COUNT(*) | 需要全表扫描(无WHERE 时) | 直接返回保存的计数(极快) |
五、 存储引擎选择
选择存储引擎需要根据应用的核心需求来决定。
需求场景 | 推荐引擎 | 理由 |
---|---|---|
绝大多数通用业务场景 | InnoDB ✅ | 支持事务、行级锁、外键,数据安全性和并发性能是首要考虑 |
读远大于写,且不需要事务 | MyISAM | 在只读或轻度写入场景下,COUNT(*) 等特定操作更快 |
需要全文索引 (MySQL 5.6前) | MyISAM | 早期版本中唯一支持全文索引的引擎 |
临时数据、高速缓存 | Memory | 数据存储在内存中,读写速度极快 |
日志记录、数据归档 | Archive | 极高的压缩比,节省存储空间 |
六、现代 MySQL 开发的黄金法则
除非有非常特殊且合理的理由,否则请始终使用 InnoDB 存储引擎。
自 MySQL 5.5.8 起,InnoDB 已成为默认引擎。
它提供了事务安全和行级锁,这是现代应用程序的基石。
在大多数情况下,其性能已经优于或等同于 MyISAM。
MySQL 8.0 中,MyISAM 的相关系统表也已被 InnoDB 替代,这预示着其未来的地位。
小结
存储引擎是 MySQL 数据库的心脏,它决定了数据的存储方式、事务能力、并发控制和可靠性。理解不同存储引擎的特点,并根据业务需求做出正确选择,是构建高性能、高可用数据库应用的关键一步。在当今,InnoDB 是你不二的选择。