MYSQL-数据引擎(InnoDB)

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

图片

数据库是一个系统(应用)最重要的资产之一,所以我们的数据库将从以下几个数据库来进行介绍。

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 会根据定义的规则(RESTRICTCASCADESET 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

 + .ibd (独立表空间) 或 ibdata1

.frm

.MYD (数据), .MYI (索引)

崩溃恢复优秀

 (Redo/Undo Log)

较差,易损坏

主要应用绝大多数场景

:OLTP、高并发、需要事务

只读/读远大于写、不需要事务、全文搜索(旧版)

运维小路

一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

关注微信公众号《运维小路》获取更多内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值