mysql数据库相关流程图/原理图( 二 )

区(extent)

  • 区是由连续页组成的空间 , 在任何情况下每个区的大小都为1MB 。
  • 为了保证区中页的连续性 , InnoDB存储引擎一次从磁盘申请4~5个区 。
  • 默认情况下 , InnoDB存储引擎页的大小为16KB , 一个区中一共64个连续的区 。
页(page)
  • 页是InnoDB磁盘管理的最小单位 。
  • 在InnoDB存储引擎中 , 默认每个页的大小为16KB 。
  • 从InnoDB1.2.x版本开始 , 可以通过参数innodb_page_size将页的大小设置为4K , 8K , 16K 。
  • InnoDB存储引擎中 , 常见的页类型有:数据页 , undo页 , 系统页 , 事务数据页 , 插入缓冲位图页 , 插入缓冲空闲列表页等 。
4.Innodb页结构相关示意图
Innodb页结构单体图
InnoDB数据页由以下7部分组成 , 如图所示:
mysql数据库相关流程图/原理图

文章插图
 
其中File Header、Page Header、File Trailer的大小是固定的 , 分别为38 , 56 , 8字节 , 这些空间用来标记该页的一些信息 , 如Checksum , 数据页所在B+树索引的层数等 。User Records、Free Space、Page Directory这些部分为实际的行记录存储空间 , 因此大小是动态的 。
下边我们用表格的方式来大致描述一下这7个部分:
mysql数据库相关流程图/原理图

文章插图
【mysql数据库相关流程图/原理图】 
记录在页中的存储流程图
每当我们插入一条记录 , 都会从Free Space部分 , 也就是尚未使用的存储空间中申请一个记录大小的空间划分到User Records部分 , 当Free Space部分的空间全部被User Records部分替代掉之后 , 也就意味着这个页使用完了 , 如果还有新的记录插入的话 , 就需要去申请新的页了 , 这个过程的图示如下:
mysql数据库相关流程图/原理图

文章插图
 
不同Innodb页构成的数据结构图
一张表中可以有成千上万条记录 , 一个页只有16KB , 所以可能需要好多页来存放数据 。不同页其实构成了一条双向链表 , File Header是InnoDB页的第一部分 , 它的FIL_PAGE_PREV和FIL_PAGE_NEXT就分别代表本页的上一个和下一个页的页号 , 即链表的上一个以及下一个节点指针 。
mysql数据库相关流程图/原理图

文章插图
 
5.Innodb索引结构图
我们先看一份数据表样本 , 假设Col1是主键 , 如下:
mysql数据库相关流程图/原理图

文章插图
 
B+树聚集索引结构图
mysql数据库相关流程图/原理图

文章插图
 
  • 聚集索引就是以主键创建的索引
  • 聚集索引在叶子节点存储的是表中的数据
非聚集索引结构图
假设索引列为Col3 , 索引结构图如下:
mysql数据库相关流程图/原理图

文章插图
 
  • 非聚集索引就是以非主键创建的索引
  • 非聚集索引在叶子节点存储的是主键和索引列
  • 使用非聚集索引查询出数据时 , 拿到叶子上的主键再去查到想要查找的数据 。(拿到主键再查找这个过程叫做回表)
  • 假设所查询的列 , 刚好都是索引对应的列 , 不用再回表查 , 那么这个索引列 , 就叫覆盖索引 。
InnoDB 锁类型思维导图
mysql数据库相关流程图/原理图

文章插图
 
加锁机制
乐观锁与悲观锁是两种并发控制的思想 , 可用于解决丢失更新问题 。
乐观锁
  • 每次去取数据 , 都很乐观 , 觉得不会出现并发问题 。
  • 因此 , 访问、处理数据每次都不上锁 。
  • 但是在更新的时候 , 再根据版本号或时间戳判断是否有冲突 , 有则处理 , 无则提交事务 。
悲观锁