## 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 文档支持 删除了基于文件的表元数据存储 引入了原子数据定义更改