通过以上几篇文章分别介绍了 MySQL 的文件系统、索引、锁、事务等功能点,这篇文章将对这些知识点进行汇总,描述出 MySQL 大概的架构。
1. 文件数据
MySQL 在文件数据上可以划分为 MySQL 系统数据 和 存储引擎数据。
- 文件数据
- 系统文件
- 参数文件
- 参数文件指的是系统运行时的参数,主要分为 ‘静态参数’ 和 ‘动态参数’。
- 日志文件
- 系统错误日志文件
- 二进制日志 (binlog)
- binlog 目前有三种记录格式,分别是 STATEMENT、ROW 和 MIXED。其中,ROW 和 STATEMENT 格式不兼容,因为 binlog 是在事务提交时写入。
- 慢查询日志
- 查询日志
- 套接字文件
- 套接字文件是 UNIX 下使用套接字链接方式打开的 socket 文件。
- pid 文件
- 表结构文件
- 定义表结构的文件,每个表都有一个 frm 的表结构文件。
- 参数文件
- InnoDB 存储引擎文件
- 表空间文件
- 实际存储数据的文件,名称为 ibdata1 的文件作为共享表空间文件,MySQL 也支持为每个表单独设置表空间文件,后缀名为 .ibd。
- redo log
- redoLog 又称为重做日志,文件名称为 ib_logfile0/ib_logfile1。
- 表空间文件
- 系统文件
2. 索引系统
MySQL 的索引系统主要是由于 B+ 树索引作为底层数据结构,也有采用 Hash 自适应索引场景。
- 索引
- 分类
- B+Tree 索引
- B+ 树索引作为 MySQL 底层数据结构的好处在于 B+ 树平衡且层级不高,并且叶子节点可以作为聚集索引。
- 全文索引
- MySQL 的全文索引也是采用倒排算法,通过关键字来进行文档映射,现实工作中未涉及到,因此未详细研究。
- Hash 索引
- InnoDB 只支持自适应的 Hash 索引,不能显式地创建,并且要满足 Hash 索引自动创建的条件(等值查询、命中范围、查询频率)。
- B+Tree 索引
- 分类
3. 锁
- 锁
- 锁分类
- 行级锁
- 共享锁 (S 锁)
- 共享锁允许事务同时读取同一行数据。
- 排他锁 (X 锁)
- 排他锁是独占锁,不允许其他事务读取或操作数据。
- 共享锁 (S 锁)
- 表锁
- 意向共享锁 (IS 锁)
- 意向共享锁是表维度的锁,在事务尝试读取表中某行数据时自动加上,同理意向排他锁也是这个逻辑。设计意向锁的主要目的是在于,当事务想要获取到表锁时,可以直接通过是否能获取到意向锁来判断,相当于一个表级别的锁标志。
- 意向排他锁 (IX 锁)
- 意向共享锁 (IS 锁)
- 锁算法
- 行锁
- 行锁的作用范围是对数据的某一行进行操作。
- 间隙锁
- 间隙锁是对数据间隙进行上锁,这样可以防止数据出现幻读的情况。
- Next-Key Lock
- 行锁 + 间隙锁就是 Next-Key Lock。
- 锁降级
- 当确定可以使用行锁时,Next-Key Lock 会降级成行锁。
- 行锁
- 行级锁
- 锁分类
4. 事务
- 事务
- 事务的隔离级别
- 串行化 (Serializable)
- 读未提交 (Read Uncommitted)
- 读已提交 (Read Committed)
- 可重复读 (Repeatable Read)
- 串行化
- 串行化指的是事务按照串行化执行的结果执行,InnoDB 的串行化是通过增加读锁的方式来实现的。
- 读未提交
- 读未提交指的是当前事务可以读取到其他事务尚未提交的数据,底层实现是当前事务直接返回记录上的最新值。
- 读已提交
- 读已提交指的是事务中的 SQL 在执行时会去读取最后一次提交的数据信息。
- 可重复读
- 可重复读指的是事务开始时会分配一个全局唯一且自增的事务 ID,并且可重复读只能读取到小于等于该事务 ID 的数据。快照数据是通过 UNDO LOG 实现的。
- 事务的隔离级别
总结
本文对 MySQL 的关键组成部分进行了总结,包括文件数据管理、索引系统的实现、锁机制以及事务处理。通过对这些知识点的梳理,可以帮助读者更好地理解 MySQL 的整体架构和工作原理。