一、MySQL 四层体系结构
1. 连接层
- 最上层,负责客户端与服务器的连接处理、授权认证、安全方案制定。
- 管理连接池,实现线程复用、连接限制、内存检查与缓存管理。
- 支持多种客户端连接器:Native C API、JDBC、ODBC、.NET、PHP、Python、Perl 等,兼容不同语言开发。
- 核心职责:验证客户端身份与操作权限,保障安全接入。
2. 服务层
- MySQL 核心服务层,所有跨存储引擎的功能均在此实现。
- 包含核心模块:
- 连接池:管理线程复用、连接数限制、内存检查与缓存。
- SQL 接口:处理 DML(数据操作)、DDL(数据定义)、存储过程、视图、触发器等。
- 解析器:完成 SQL 语句解析、对象权限检查。
- 查询优化器:生成最优执行路径,通过统计信息选择访问策略。
- 缓存:全局缓存与引擎级缓存,提升查询性能。
- 系统管理和控制工具:备份恢复、安全管理、复制、集群、配置管理、元数据管理等。
3. 引擎层(可插拔存储引擎)
- 真正负责数据的存储与提取,服务器通过 API 与存储引擎通信。
- 存储引擎是基于表的(而非基于库),也称为表类型,不同表可使用不同引擎。
- 主流引擎:InnoDB(默认)、MyISAM、Memory、NDB、Archive 等,可根据业务需求灵活选择。
4. 存储层
- 将数据与日志持久化到文件系统之上,与存储引擎完成交互。
- 包含系统文件(NTFS、ext2/3、NFS、SAN、NAS 等)和各类日志文件:Redo log、Undo log、数据文件、索引文件、二进制日志、错误日志、查询日志、慢查询日志等。
二、三大主流存储引擎详解
1. InnoDB 引擎(MySQL 5.5+ 默认)
核心介绍
- 兼顾高可靠性与高性能的通用存储引擎,是现代 MySQL 应用的默认选择。
- 支持完整的事务特性,遵循 ACID 模型。
核心特点
- 事务安全:支持事务(Transaction),保障数据操作的原子性、一致性、隔离性、持久性。
- 锁机制:采用行级锁(Row-Level Locking),大幅提升并发访问性能,适合多写场景。
- 外键约束:支持 FOREIGN KEY 外键,保证数据完整性与正确性。
- 索引支持:默认 B+Tree 索引,MySQL 5.6 版本后开始支持全文索引。
- 崩溃恢复:具备崩溃恢复能力,可通过 Redo/Undo 日志恢复数据,保障数据安全。
- 存储限制:单表最大存储容量可达 64TB。
- 空间与内存使用:占用空间与内存较高(需存储数据、索引及事务日志)。
- 批量插入速度:相对较慢(事务日志与锁机制带来开销)。
存储文件
- 每张表对应一个
.ibd文件(由参数innodb_file_per_table控制),存储表结构(frm/sdi)、数据和索引。 - 逻辑存储结构:表空间(Tablespace)→ 段(Segment)→ 区(Extent)→ 页(Page)→ 行(Row),行结构包含事务 ID、回滚指针、列数据等。
2. MyISAM 引擎(MySQL 早期默认)
核心介绍
- MySQL 5.1 及之前版本的默认存储引擎,以读性能优异著称。
- 不支持事务与外键,属于非事务型引擎。
核心特点
- 事务安全:不支持事务,不保证数据操作的原子性与一致性。
- 锁机制:采用表级锁(Table-Level Locking),并发写性能差,读性能较高。
- 外键约束:不支持外键。
- 索引支持:默认 B+Tree 索引,原生支持全文索引。
- 崩溃恢复 :不支持自动崩溃恢复,崩溃后需手动执行
REPAIR TABLE修复,存在数据丢失风险。 - 存储限制:存在存储容量限制。
- 空间与内存使用:占用空间与内存较低(无需存储事务日志)。
- 批量插入速度:极快(无事务开销与行锁开销)。
存储文件
- 每张表对应三类文件:
.sdi:存储表结构信息。.MYD:存储表数据。.MYI:存储表索引。
3. Memory 引擎(内存存储引擎)
核心介绍
- 表数据完全存储在内存中,访问速度极快,但数据易失(断电或重启后丢失)。
- 仅用于临时表或缓存场景,不适合存储核心业务数据。
核心特点
- 事务安全:不支持事务。
- 锁机制:采用表级锁,并发性能有限。
- 外键约束:不支持外键。
- 索引支持:默认 Hash 索引(等值查询极快),也支持 B+Tree 索引。
- 数据安全:数据完全存储在内存中,断电或服务重启后数据全部丢失。
- 存储限制:表大小受物理内存限制,无法存储大表。
- 空间与内存使用:占用中等内存(数据全存内存),无磁盘空间占用(除表结构文件)。
- 批量插入速度:极快(内存操作无磁盘 I/O 开销)。
存储文件
- 仅存储
.sdi表结构文件,数据与索引均在内存中,不落地磁盘。
三、存储引擎选型指南
1. InnoDB 适用场景
- 对事务完整性要求高,需要保障数据一致性的业务(如金融、电商订单)。
- 并发访问频繁,存在大量更新、删除操作的系统。
- 需要外键约束保障数据完整性的场景。
- 现代 MySQL 应用的默认首选,覆盖 90% 以上业务场景。
2. MyISAM 适用场景
- 以读操作和插入操作为主,极少更新、删除的静态业务(如日志库、历史数据归档)。
- 对事务完整性、并发性能要求极低的老旧系统。
- 目前已逐渐被 InnoDB 替代,仅在特定历史场景中使用。
3. Memory 适用场景
- 用于临时表 或缓存表,存储高频访问的中间结果集。
- 对访问速度要求极高,且数据可丢失的场景(如会话数据、临时统计数据)。
- 不适合存储核心业务数据,避免断电导致数据丢失。
四、常用操作命令
sql
-- 查看当前数据库支持的所有存储引擎
SHOW ENGINES;
-- 查看指定表的存储引擎
SHOW CREATE TABLE 表名;
-- 创建表时指定存储引擎
CREATE TABLE 表名(
字段1 字段1类型 [COMMENT 字段1注释],
字段2 字段2类型 [COMMENT 字段2注释],
...
) ENGINE = 引擎名 [COMMENT 表注释];
-- 示例:创建表并指定 InnoDB 引擎
CREATE TABLE user(
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',
name VARCHAR(50) NOT NULL COMMENT '用户名'
) ENGINE = InnoDB COMMENT '用户表';
五、核心特性对比总表
表格
| 特性 | InnoDB | MyISAM | Memory |
|---|---|---|---|
| 存储限制 | 64TB | 有 | 有 |
| 事务安全 | 支持 | 不支持 | 不支持 |
| 锁机制 | 行级锁 | 表级锁 | 表级锁 |
| B+Tree 索引 | 支持 | 支持 | 支持 |
| Hash 索引 | 不支持 | 不支持 | 支持(默认) |
| 全文索引 | 5.6+ 支持 | 支持 | 不支持 |
| 空间使用 | 高 | 低 | N/A |
| 内存使用 | 高 | 低 | 中等 |
| 批量插入速度 | 低 | 高 | 高 |
| 外键支持 | 支持 | 不支持 | 不支持 |
| 崩溃恢复 | 支持 | 需手动修复 | 数据易失 |
