MySQL(上)

262 阅读3分钟

Page 页

InnoDB 数据页结构

记录

图片.png

记录头信息

图片.png

  • deleted_flag
    • 逻辑删除
    • 删除操作:
      1. 把deleted_flag=1(0是未删除)
      2. 把删除掉的记录,要组成一个垃圾链表。(目的:空间的可重用)
  • min_rec_flag
    • B+树每层非叶子节点中标识最小的目录项记录
  • n_owned
    • 把一个页划分成若干个组,一个组里的组长(组里主键最大)保存该值,该值表示一个组里有多少条记录
  • heap_no
    • 堆号,每条插入进来的记录都会分配堆号,从heap_no=2开始 infimum的堆号是0,superMun的堆号是1
  • record_type
    • 记录类型

      1. 普通记录

      2. B+树每层非叶子节点目录项记录

      3. 表示infimun的记录

      4. 表示supermun的记录

  • next_record
    • 下一条记录。 从当前记录的真实数据到下一条记录的真实数据的距离

page Directory(页目录)

图片.png

  • 最底层的记录特点
    1. 按照主键从小到大排序
    2. 单向链表
  • 图书的目录
  • 分组的规则
    1. 对于infimum记录,组里只能有一条记录,就是他自己
    2. 对于supermum,组里只要能有1-8条记录
    3. 对于其他记录,组里只要能有4-8条记录
  • 分组的步骤
    1. 最初的时候,没有记录,一个新的数据页有两个组,infimum组一条记录;另一是Supermum组一条记录
    2. 插入数据的时候,往supermum组里插入,n_owned要加一
    3. supermum组满了,进行拆分,一个组拆成两个组(4+5),申请新的槽位
  • 删除记录操作
    • delete_flag赋值为1
    • 上一条的next_record指针指向下一条
    • supermum的n_owned-1
  • 查询的过程是什么?
    • 先去找槽位
    • 从组里面最小记录,next_record最小的开始遍历

B树&B+树

图片.png

索引

  • 聚簇索引 主键索引(B+树)
  • 二级索引 非主键(给非主键加索引),找到对应的主键,进行回表操作,通过主键查找数据
  • 联合索引

Buffer Pool缓冲池

  • 缓存
  • 索引、数据--->页--->磁盘里的
  • 查一条记录 但是我们要把该记录的所在页都缓存到内存中
  • 不在一个页里,那就会有大量的io操作

缓冲池概述

图片.png

  • 控制块和缓冲页是一一对应的
  • free链表
    • 用来分配空间的,将需要缓存的页,取得控制块,将需要缓存的页缓存起来
  • flush链表
    • 将修改过的缓冲页对应的控制块,放到flush链表里面,对应所有的脏页
  • 什么时候,会将脏页刷新到磁盘?
    • 从flush链表中刷新一部分页面到磁盘

      1. 后台有线程,根据系统的繁忙程度来确定刷新的速率。BUF_FLUSH_LIST
      2. 系统很繁忙,造成我们刷新脏页到磁盘的速度很慢,没有可用的缓冲页,就会去查看LRU链表尾部,是不是可以直接释放掉的未修改的缓冲页,如果没有的话,不得不将LRU链表尾部的一个脏页同步刷新到磁盘中。 BUF_FLUSH_SINGLE_PAGE
    • 从LRU链表的冷数据汇总刷新一部分页面到磁盘 BUF_FLUSH_LRU

      图片.png

      1. 查询的时候,将使用过数据放到链表的头部
      2. 预读的时候把页会放到冷数据里面
      3. 全表扫不会冲掉热数据区域 可以配置XXX毫秒之内多次查询某页,就确定为全表扫
    • 一个bufferpool有多个chunk,修改大小时,可以新建一个chunk,对原来的chunk进行复制