4.3 KiB
MySQL 逻辑架构
连接管理与安全性
默认情况下,每个客户端连接在服务器进程中拥有一个线程,服务器维护了一个缓冲区,用于存放已就绪的线程
当客户端连接时,服务器需要对其进行身份验证,基于用户名,发起主机名和密码,连接成功后验证器权限
优化与执行
解析查询以创建内部数据结构,然后对其进行优化,包括重写查询,决定表的读取顺序,选择何时的索引
并发控制
读写锁
资源上的读锁是共享的,多个客户端可以同时读取一个资源而互不干扰, 写锁是排他的,一个写锁即会阻塞读锁也会阻塞其它的写锁,只有这样才能保证特定的时间点只有一个客户端执行写入,防止其它客户端读取正在写入的资源
锁的粒度
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 文档支持
删除了基于文件的表元数据存储
引入了原子数据定义更改
