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

4.3 KiB
Raw Blame History

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 文档支持

删除了基于文件的表元数据存储

引入了原子数据定义更改