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