一、MySQL 存储引擎原理拆解

`

mysql 存储最小单位 page

一、MySQL 记录存储

image-20211031115018726

1、页头
记录页面的控制信息,共占56字节,包括页的左右兄弟页指针、页面空间使用情况等

2、虚记录
最大虚记录(比页内最大主键还大)
最小虚记录(比页内最小主键还小)

3、记录堆
行记录存储区,分为有效记录和已删除记录两种

4、自由空间链表
已删除记录组成的链表

5、未分配空间
页面未使用的存储空间

6、Slot 区

7、页尾
页面最后部分,占8个字节,主要存储页面的校验信息

二、页内记录维护

1、顺序保证

  • 物理有序

    image-20211031123252813

  • 逻辑有序
    查询速度可以优化

    image-20211031124530650

2、插入策略

  • 自由空间链表
  • 未分配空间

数据库收缩,主从,删从库,重新创建从库,全量同步。从库切主库,主库变从库,再删从库,重新创建从库,全量同步

3、页内查询

  • 遍历
  • 二分查询

image-20211031130530624

所有记录以逻辑有序的方式存为链表,Slot 区将链表分为多个 sub list,对 slot 区进行二分查找,快速定位到 sub list,然后遍历 sub list

二、MySQL 锁

一、Innodb 锁种类

1、锁粒度

  • 行级锁

    • 作用在索引上
    • 聚簇索引 & 二级索引

    image-20211101110443780

RC 隔离级别,非唯一索引

image-20211101111135026

RR 隔离级别,非唯一索引(加间隙锁)

image-20211101111947504

  • 间隙锁
    • 解决可重复读模式下的幻读问题
    • GAP 锁不是加在记录上的,锁住两条记录之间
    • 保证两次当前读返回一致的记录
  • 表级锁
    • 全表扫描

2、类型

  • 共享锁(S)
    读锁,可以同时被多个事务获取,阻止其他事务对记录的修改
  • 排它锁(X)
    写锁,只能被一个事务获取,允许获得锁的事务修改数据

所有当前读(select for update、update、delete)加排它锁