特性:存储引擎架构,将查询处理及其他系统任务和数据的存储、提取相分离 1.1 MySQL逻辑架构 第一层:连接/线程处理 第二层:查询缓存、解析器、优化器 包括查询解析、分析、优化、缓存以及内置还函数
特性:存储引擎架构,将查询处理及其他系统任务和数据的存储、提取相分离
1.1 MySQL逻辑架构
第一层:连接/线程处理
第二层:查询缓存、解析器、优化器
包括查询解析、分析、优化、缓存以及内置还函数,存储过程、触发器、视图
第三层:存储引擎
数据的存储和提取
1.1.1 连接管理与安全性
认证、权限
1.1.2 优化与执行
优化器不关心表使用什么存储引擎
查询缓存 -> 解析查询并创建解析数 -> 优化(重写查询、表的读取顺序、合适的索引) hint explain
1.2 并发控制
1.2.1 读写锁
共享锁、排它锁
1.2.2 锁粒度
每种存储引擎都可以实现自己的锁策略和锁粒度
表锁、行级锁
1.3 事务 ACID
原子性:不可分割、全部成功或者全部失败回滚
一致性:一个一致性状态转换到另一个一致性状态
隔离性:通常来说一个事务所做的修改提交以前对其他事务不可见。 隔离级别
持久性:一旦事务提交,其所做的修改就会永久保存在数据库中
根据业务是否需要事务处理来选择合适的存储引擎
1.3.1 隔离级别
READ UNCOMMITTED 未提交读:事务中的修改及时没有提交对其他事务也是可见的,脏读
READ COMMITTED 提交读:不可重复读
REPEATABLE READ:同一个事务中多次读取同样记录的结果是一致的,默认事务隔离级别
幻读:
事务1 查询id=1是否存在,不存在插入id=1的记录
select * from User where id = 1;
insert into `User`(`id`, `name`) values (1, 'A');
事务2 插入id=1的记录
insert into ` User`(`id`, `name`) values (1, 'B');
当事务1查询id=1不存在后,事务2插入了id=1的记录,此时事务1再插入就会主键冲突
SERIALIZBLE 可串行化
1.3.2死锁
死锁检测和死锁超时机制
InnoDB:将持有最少行级排它锁的事务进行回滚
1.3.3 事务日志
追加的方式
事务日志持久化,内存中修改的数据在后台慢慢刷回到磁盘
1.3.4 MYSQL中的事务
自动提交模式 set autocommit = 1 1或者ON启用
设置隔离级别 set transaction isolation level
InnoDB 两阶段锁定协议:加锁、解锁,无法解决死锁 COMMIT ROLLBACK
显示锁定 select ... lock in share mode select ... for update
1.4 多版本并发控制 MVCC
保存数据在某个时间点的快照
InnoDB 每行记录后面保存两个隐藏的列,一个保存行的创建系统版本号,一个保存行的删除系统版本号。每开始一个新的事务,系统版本号自动递增
(1)DB_TRX_ID,6字节,记录每一行最近一次修改它的事务ID;
(2)DB_ROLL_PTR,7字节,记录指向回滚段undo日志的指针;
(3)DB_ROW_ID,6字节,单调递增的行ID;
普通锁 串行
读写锁 读读并发
多版本 读写并发
redo日志用于保障已提交事务的ACID特性
undo日志用于保障未提交事务不会影响ACID
1.5 MySQL存储引擎
表的定义.frm文件 服务层统一处理
show table status
1.5.1 InnoDB存储引擎
间隙锁锁定间隙,防止间隙被其他事务插入,不可重复读
临界锁锁定索引记录+间隙防止幻读