Files
Hui-s-notebook/203-Java/203.1-Java面试/205.14-MySQL/MySQL 架构.md
2023-09-10 10:50:53 +08:00

125 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## MySQL 逻辑架构
![[Pasted image 20230708181100.png]]
### 连接管理与安全性
默认情况下,每个客户端连接在服务器进程中拥有一个线程,服务器维护了一个缓冲区,用于存放已就绪的线程
当客户端连接时,服务器需要对其进行身份验证,基于用户名,发起主机名和密码,连接成功后验证器权限
### 优化与执行
解析查询以创建内部数据结构,然后对其进行优化,包括重写查询,决定表的读取顺序,选择何时的索引
## 并发控制
### 读写锁
[[共享锁]]和[[排他锁]]
资源上的读锁是共享的,多个客户端可以同时读取一个资源而互不干扰,
写锁是排他的,一个写锁即会阻塞读锁也会阻塞其它的写锁,只有这样才能保证特定的时间点只有一个客户端执行写入,防止其它客户端读取正在写入的资源
锁的粒度
[[表锁]]
MySQL 中最基本也是开销最小的锁策略,锁定整张表
[[行级锁]]
可以最大程度地支持并发处理,也带来了最大的锁开销,锁定某一行
## 事务
### ACID
[[原子性]]
一个事物必须被视为一个不可分割的工作单元,整个事务中的所有操作要么全部提交成功,要么全部回滚失败
[[一致性]]
数据库总是从一个一致性状态转换到下一个一致性状态
[[隔离性]]
一个事务所做的修改在最终提交前,对其它事务是不可见的
[[持久性]]
一旦提交,事务所做的修改就会被永久保存到数据库中
### 隔离级别
[[READ UNCOMMITTED]] 未提交读
在事务中可以查看其他事务中还没有提交的修改,读取未提交的数据,也称为脏读
[[READ COMMITTED]] 提交读
一个事物可以看到其它事务在它开始之后提交的修改,但在该事务提交前,其所做的任何修改对其他事务都是不可见的,依然允许不可重复读
[[REPEATABLE READ]] 可重复读
保证了在同一个事务中多次读取相同行数据的结果是一样的
[[SERIALIZABLE]] 可串行化
强制事务按序执行
### 死锁
指两个或多个事务相互持有和请求相同资源上的锁,产生了循环依赖
### 事务日志
存储引擎秩序更改内存中的数据副本,不用修改磁盘中的表,然后把更改的记录写入事务日志中,事务日志会持久化保存到硬盘上
### MySQL 中的事务
AUTOCOMMIT
默认情况下,单个 INSERT、UPDATE、DELETE 语句会被隐式包装到一个事务中执行并在成功后提交,
通过禁用该模式,可以在事务中执行一系列语句,并在结束时执行 COMMIT 或 ROLLBACK
MySQL 事务是由下层的存储引擎实现的,在同一个事务中,混合使用多种存储引擎是不可靠的
> 最好不要在应用程序中混合使用存储引擎。失败的事务可能导致不一致的结果,因为某些部分可以回滚,而其他部分不能回滚
隐式锁定和显示锁定
InnoDB 使用两阶段锁定协议,事务执行期间,随时都可以获得锁,但是锁只有在提交和回滚后才会释放,并且所有的锁会同时释放
> LOCK TABLES 命令和事务之间的交互非常复杂,并且在一些服务器版本中存在意想不到的行为。因此,本书建议,除了在禁用 AUTOCOMMIT 的事务中可以使用之外,其他任何时候都不要显式地执行 LOCK TABLES不管使用的是什么存储引擎
## 多版本并发控制
[[MMVC]] 多版本并发控制
MVCC 仅适用于 REPEATABLE READ 和 READ COMMITTED 隔离级别
## 复制
源节点为每个副本提供一个线程,该线程作为复制客户端登录,写入发生时会被唤醒,发送新数据
## 数据文件结构
表的元数据重新设计为一种数据字典,包含在表的 ibd 文件中,操作期间引入了字典对象缓存
## InnoDB 引擎
默认事务型存储引擎,为处理大量短期事务而设计的
> 最佳实践是使用 InnoDB 存储引擎作为所有应用程序的默认引擎。在好几个大版本之前MySQL 已经将 InnoDB 作为默认引擎,这让事情变得简单了
使用 MMVC 来实现高并发性,实现了 4 个标准隔离级别
基于聚簇索引构建的,提供了非常快的主键查找
JSON 文档支持
删除了基于文件的表元数据存储
引入了原子数据定义更改