MySQL 存储引擎原理 & 锁
一、MySQL 存储引擎原理拆解
`
mysql 存储最小单位 page
一、MySQL 记录存储
1、页头
记录页面的控制信息,共占56字节,包括页的左右兄弟页指针、页面空间使用情况等
2、虚记录
最大虚记录(比页内最大主键还大)
最小虚记录(比页内最小主键还小)
3、记录堆
行记录存储区,分为有效记录和已删除记录两种
4、自由空间链表
已删除记录组成的链表
5、未分配空间
页面未使用的存储空间
6、Slot 区
7、页尾
页面最后部分,占8个字节,主要存储页面的校验信息
二、页内记录维护
1、顺序保证
物理有序
逻辑有序
查询速度可以优化
2、插入策略
- 自由空间链表
- 未分配空间
数据库收缩,主从,删从库,重新创建从库,全量同步。从库切主库,主库变从库,再删从库,重新创建从库,全量同步
3、页内查询
- 遍历
- 二分查询
所有记录以逻辑有序的方式存为链表,Slot 区将链表分为多个 sub list,对 slot 区进行二分查找,快速定位到 sub list,然后遍历 sub list
二、MySQL 锁
一、Innodb 锁种类
1、锁粒度
行级锁
- 作用在索引上
- 聚簇索引 & 二级索引
RC 隔离级别,非唯一索引
RR 隔离级别,非唯一索引(加间隙锁)
- 间隙锁
- 解决可重复读模式下的幻读问题
- GAP 锁不是加在记录上的,锁住两条记录之间
- 保证两次当前读返回一致的记录
- 表级锁
- 全表扫描
2、类型
- 共享锁(S)
读锁,可以同时被多个事务获取,阻止其他事务对记录的修改 - 排它锁(X)
写锁,只能被一个事务获取,允许获得锁的事务修改数据
所有当前读(select for update、update、delete)加排它锁
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Mr.Wantの博客!