作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

数据库是一个系统(应用)最重要的资产之一,所以我们的数据库将从以下几个数据库来进行介绍。
MySQL(本章节)
PostgreSQL
MongoDB
Redis
Etcd
通过前面一个小节的介绍,我们对数据引擎有一个简单的认识,今天我们来介绍一个目前大面积使用的另外一个引擎:InnoDB。
一、核心特性与优势
1. 事务支持 (ACID Compliant)
这是 InnoDB 最核心的特性,也是它取代 MyISAM 成为默认引擎的主要原因。
-
原子性 (Atomicity): 通过 Undo Log 实现。事务中的所有操作要么全部完成,要么全部不完成。如果事务中途失败,会利用 Undo Log 回滚到事务开始前的状态。就像银行转账,从A账户扣钱和向B账户加钱这两个操作,必须同时成功或同时失败。不可能发生钱扣了但没到账的情况。
-
一致性 (Consistency): 通过其他三个特性(原子性、隔离性、持久性)和外键约束来共同保证数据的一致性,是其他3个特性的目的。
-
隔离性 (Isolation): 通过 锁机制 和 MVCC 实现。保证并发事务之间的操作互相不干扰,MySQL提供了4种事务隔离级别(读未提交、读已提交、可重复读、串行化)来平衡并发性能和数据一致性。
-
持久性 (Durability): 通过 Redo Log 实现。一旦事务提交,其所做的修改就会永久保存在数据库中,即使系统崩溃也不会丢失。
2. 行级锁 (Row-Level Locking)
-
InnoDB 支持行级锁。当对数据进行修改(INSERT, UPDATE, DELETE)时,只会在受影响的行上加锁,而不是锁住整个表。
-
巨大优势: 极大地提高了多用户并发操作的性能和吞吐量。多个用户可以同时读写同一张表的不同行,写操作不会阻塞读操作(基于 MVCC),写操作之间也只在同一行上才会阻塞。
3. 外键约束 (Foreign Key Support)
-
InnoDB 是 MySQL 中唯一原生支持外键约束的常用存储引擎。
-
作用: 强制保持数据的参照完整性。当你尝试删除或更新父表(主键表)中的一条记录时,InnoDB 会根据定义的规则(
RESTRICT,CASCADE,SET NULL等)自动处理子表(外键表)中的对应数据,防止出现“孤儿数据”。
4. 多版本并发控制 (MVCC - Multi-Version Concurrency Control)
-
InnoDB 通过 MVCC 来实现非阻塞读。这是实现高并发性能的关键技术。
-
工作原理: 它为每一行数据维护了多个版本(通常是两个隐藏字段:创建版本号和删除版本号)。当一个事务开始时,它只能看到在它开始之前就已经提交的数据版本(通过 Undo Log 构建),而看不到其他未提交事务或在其之后提交的事务所做的修改。
-
效果: 读操作不会阻塞写操作,写操作也不会阻塞读操作,这使得 InnoDB 即使在有大量读写混合操作的情况下也能保持良好的性能。
5. 崩溃恢复 (Crash Recovery)
-
InnoDB 拥有强大的崩溃恢复能力,这得益于其 Write-Ahead Logging (WAL) 策略。
-
关键组件:
-
Redo Log (重做日志): 事务提交时,会先将所有修改信息写入 Redo Log(顺序写入,速度很快),然后再慢慢地将数据页刷新到磁盘。如果数据库发生崩溃,重启后 InnoDB 会读取 Redo Log,重新执行(Redo)那些已提交但尚未写入数据文件的事务,从而保证持久性。
-
Undo Log (回滚日志): 用于回滚未提交的事务和实现 MVCC。
-
-
这个机制保证了数据库在遇到意外关机等故障后,数据不会丢失,并能快速恢复到一致状态。
二、物理存储结构
-
表结构: 每张 InnoDB 表在磁盘上对应一个
.frm文件(存储表定义,MySQL 8.0 后移至数据字典)和一个 表空间。 -
表空间 (Tablespace):
-
更容易回收磁盘空间(删除表后空间会释放给操作系统)。
-
便于备份和恢复单张表。
-
优化
OPTIMIZE TABLE操作。
-
系统表空间 (The System Tablespace): 默认包含所有表的数据字典、Undo Logs,以及(在旧配置中)所有表和索引的数据。对应文件通常是
ibdata1。 -
独立表空间 (File-Per-Table Tablespaces): 强烈推荐启用(通过
innodb_file_per_table=ON)。启用后,每张表的数据和索引会单独存储在一个.ibd文件中。这样做的好处是:-
更容易回收磁盘空间(删除表后空间会释放给操作系统)。
-
便于备份和恢复单张表。
-
优化
OPTIMIZE TABLE操作。
-
-
#前面是myisam引擎,后面是innodb引擎
-rw-r----- 1 mysql mysql 8672 Sep 16 21:35 myisam_table.frm
-rw-r----- 1 mysql mysql 0 Sep 16 21:35 myisam_table.MYD
-rw-r----- 1 mysql mysql 1024 Sep 16 21:35 myisam_table.MYI
-rw-r----- 1 mysql mysql 8646 Sep 16 21:34 users.frm
-rw-r----- 1 mysql mysql 114688 Sep 16 21:34 users.ibd
三、与 MyISAM 的对比总结
|
特性 |
InnoDB |
MyISAM |
|---|---|---|
| 事务 | 支持
(ACID) | 不支持 |
| 锁机制 | 行级锁 | 表级锁 |
| 外键 | 支持 |
不支持 |
| 并发性能 | 非常高
(MVCC) |
有限 (表锁制约) |
| COUNT(*) |
需要扫描表或索引(较慢) | 非常快
(存储了精确行数) |
| 全文索引 |
MySQL 5.6+ 支持 |
支持(较早版本更好) |
| 存储文件 | .frm
+ | .frm
, |
| 崩溃恢复 | 优秀
(Redo/Undo Log) |
较差,易损坏 |
| 主要应用 | 绝大多数场景
:OLTP、高并发、需要事务 |
只读/读远大于写、不需要事务、全文搜索(旧版) |
运维小路
一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!
关注微信公众号《运维小路》获取更多内容。
1195

被折叠的 条评论
为什么被折叠?



