MySQL 逻辑架构
- 第一层:连接处理、授权认证、安全等
- 第二层:存储过程、触发器、视图
- 第三层:存储引擎(插拔式架构
并发控制
- 读写锁
- 共享锁
- 排他锁
- 锁粒度
- 锁策略:在锁的开销和数据的安全性之间寻求平衡
- 表锁(MySQL服务层实现
- 行锁(存储引擎层实现
事务
-
ACID
- 原子性(atomicity
- 一致性(consistency
- 隔离性(isolation
- 持久性(durability
-
隔离级别
-
READ UNCOMMITTED(读未提交
-
READ COMMITTED(读已提交
-
REPEATBLE READ(可重复读
-
SERIALIZABLE(串休化
-
-
死锁
- 产生:两个或者多个事务在同一资源上互相占用,并请求锁定对方占用的资源,从而导致恶性循环的现象
- 解决:死锁检测 死锁超时机制(InnoDB是将持有最少行级排他锁的事务进行回滚
-
事务日志
- 预写式日志:修改数据需要写两次磁盘
-
MySQL中的事务
- 自动提交(默认
- 两阶段锁定协议:事务执行过程中,随时都可以执行锁定,锁只有在执行COMMIT或者ROLLBACK的时候才会释放,并且所有的锁是在同一时刻被释放
- 隐式锁定 / 显示锁定
多版本并发控制
- MVCC
- 避免加锁操作,开销更低,提升并发性能
- 通过保存数据在某个时间点的快照来实现
- InnoDB - MVCC
- 每行记录后增加两个隐藏的列(行的创建时间,行的过期或删除时间
- 时间依据系统版本号,开启新事务,系统版本号自动递增
- 事务开始时刻的系统版本号作为事务的版本号,用于与查询到的每行记录的版本号进行比较
- 只在隔离级别 RR 与 RC 下工作,RC 总是读取最新的数据行,SERIALIZABLE 加锁所有读取的行
- 增删改查 示例
- SELECT:符合以下条件才返回查询结果
- 只查早于当前事务版本的数据行(行的系统版本号小于等于事务的系统版本号
- 行的删除版本要么未定义,要么大于当前事务版本号
- INSERT:新插入的每一行保存当前系统版本号作为行版本号(创建标识
- DELETE:删除的每一行保存当前系统版本号作为 删除标识
- UPDATE:INSERT + DELETE
- 插入一条新记录,保存当前系统版本号作为行版本号
- 将当前系统版本号作为原来行的删除标识
- SELECT:符合以下条件才返回查询结果
MySQL 的存储引擎
- SHOW TABLE STATUS
- Rows:表中的行数,对于MyISAM等其他存储引擎,该值是精确的,对于InnoDB,该值时估计值
- InnoDB存储引擎
- 默认事务型引擎
- 处理大量的短期事务(大部分情况正常提交,很少会被回滚
- 自动崩溃恢复
- 采用MVCC来支持高并发,实现四个标准隔离级别
- RR + next-key locking 策略防止幻读的出现
- 聚簇索引、非主键索引
- 优化:可预测性预读、自适应哈希索引、缓冲区等
- 官方手册:15.2.10 . InnoDB事务模型和锁定
- MyISAM存储引擎
- 全文索引、压缩、空间函数
- 不支持事务和行级锁
- 崩溃后无法安全恢复
读后哔哔
这一章主要是入门级别的MySQL总体阐述,关于其中的并发控制、事务、InnoDB存储引擎可以搭配着《MySQL技术内幕 InnoDB存储引擎》的第二章、第六章、第七章一起来看,《高性能MySQL》 这本书后续也没有再详细的介绍以上这几个点啦。