






















.ibd文件.MYD、.MYI、.frm| 维度 | MyISAM | InnoDB |
|---|---|---|
| 事务 | 不支持 | 支持(ACID、提交/回滚) |
| 锁粒度 | 表级锁 | 行级锁(含间隙锁) |
| 外键 | 不支持 | 支持 |
| 崩溃恢复 | 仅依赖检查/修复表(REPAIR TABLE) | redo/undo 日志自动崩溃恢复 |
| 索引类型 | 非聚簇索引(数据与索引分离) | 聚簇索引(主键即数据) |
| 存储文件 | .MYD(数据)+.MYI(索引) |
.ibd(单表空间)或共享表空间 |
| COUNT(*) | 内置计数器,瞬间返回(无WHERE条件下) | InnoDB 执行 COUNT() 需要扫描可用索引或聚簇索引,数据量越大耗时越长 |
| 全文索引 | 5.6 之前仅 MyISAM 支持原生全文索引 | 5.6+ 支持,性能更优 |
| 压缩表 | myisampack 只读压缩 | 支持行格式压缩(ROW_FORMAT=COMPRESSED) |
| 适用场景 | 读多写少、无事务、静态报表 | 高并发读写、需要事务/外键/恢复保障 |
优先InnoDB:现代MySQL的默认引擎,适合99%的场景,尤其是需要事务、并发或数据安全的应用。
例外用MyISAM:仅当系统以读为主、无需事务且追求极简优化时(如静态报表),但已逐渐被InnoDB+缓存或Aria(MariaDB)替代。
MySQL 8.0已标记MyISAM为废弃引擎,仅保留InnoDB作为核心引擎。
先来看一张总览图

主要步骤:客户端发送 SQL → 连接器 → 查询缓存(8.0 已移除)→ 解析器 → 预处理器 → 优化器 → 执行器 → 存储引擎 → 返回结果
通过客户端/服务器通信协议,客户端与 MySQL 建立 TCP 连接。验证用户名、密码、权限。每个连接对应一个线程(MySQL 是线程模型)。
如果开启,会检查是否执行过完全相同的 SQL。
命中则直接返回结果,跳过后续步骤。
但由于命中率低、锁竞争严重,8.0 被废弃(实际在 5.7 起已默认关闭)。
词法分析:将 SQL 字符串拆成 token。
语法分析:构建语法树(AST),检查语法是否正确。比如:select * form user (form写错了应该是from)→ 会报错 syntax error。
语义分析:检查表、列是否存在。别名是否合法。展开视图、子查询等。
权限验证:检查用户是否有访问表的权限。
这里是核心阶段:决定怎么执行这条 SQL。
主要工作包括:
你可以用 EXPLAIN 或 EXPLAIN FORMAT=JSON 查看优化器的选择。
WHERE 过滤、排序、聚合、LIMIT 等操作。UPDATE/DELETE,还会加锁(行锁、间隙锁等)。这里真正负责数据在磁盘与内存间的读写。
关键操作步骤:
Buffer Pool)。Next-Key Lock)。undo log(用于事务回滚)。redo log(保证崩溃恢复)。如果是写操作,还会:
redo log(WAL 机制)。SELECT:将结果集封装成协议包返回客户端。DML:返回影响的行数、自增 ID 等(如INSERT … VALUES …)。SELECT * FROM user WHERE id = 10
上面这段SQL的执行步骤如下:
数据库的事务机制是数据库管理系统(DBMS)执行过程中的一个逻辑单位,核心目标是通过特定的控制逻辑,确保一组操作要么全部成功执行,要么在发生异常时全部回滚至初始状态,从而维护数据的完整性与业务逻辑的正确性。
事务机制通常遵循ACID原则,这是四个基本特性的缩写:
事务中的所有操作要么全部完成,要么全部不完成,不会结束在中间某个点。如果事务中的某个操作失败,整个事务将回滚到执行前的状态,就像这个事务从未执行过一样。
事务必须保证数据库从一个一致的状态转移到另一个一致的状态。这意味着事务执行的结果必须是数据库完整性约束没有被破坏,所有的规则都必须应用于事务的修改。
并发执行的事务之间不会互相影响。一个事务的中间状态对其他事务是不可见的。事务的隔离性防止了多个事务并发执行时由于交叉执行导致数据的不一致。
一旦事务提交,它对数据库的改变就是永久性的,即使系统发生故障,提交的事务结果也不会丢失。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。