作者介绍:简历上没有一个精通的运维工程师,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
数据库是一个系统(应用)最重要的资产之一,所以我们的数据库将从以下几个数据库来进行介绍。
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 的对比总结
.frm + .ibd (独立表空间) 或 ibdata1
.frm, .MYD (数据), .MYI (索引)