天天看点

MySQL的故事汇【第一季】【第1集】索引

createdtime 20220401
updatedtime 20220401
author venki.chen
数据池
MySQL的故事汇【第一季】【第1集】索引
主键索引树在磁盘的存在形式
MySQL的故事汇【第一季】【第1集】索引
普通索引树在磁盘的存在形式
MySQL的故事汇【第一季】【第1集】索引
数据在内存的形式
MySQL的故事汇【第一季】【第1集】索引
数据在buffer pool
MySQL的故事汇【第一季】【第1集】索引
buffer pool
  1. buffer pool中的页是从磁盘中的页复制而来的;
  2. 每页数据占据空间为16kb,buffer pool默认空间大小为128M,大概可以存放8192页;
free链表
  1. 此链表为free链表,专门用于存储buffer pool中空置页信息;
  2. 由基结点和控制块结点组成;
  3. 基结点用于存储结点信息(首尾结点指针地址等);
  4. 控制块用于管理空白页;
  5. 从磁盘中取到数据后,通过free链表,找到空白页,然后将数据复制过去,之后移除free链表此控制块;
flush链表
  1. 当执行数据更新等操作,引起buffer pool中的页数据变化后,此时的数据页可以理解为脏页(数据并不是立马写入磁盘的,性能不够好),而记录这些脏页的信息就是flush链表的意义;
  2. 可以理解为:MySQL后台线程会定时的寻找脏页,然后添加到链表;
  3. 脏页最后是需要持久化到磁盘的;
  4. 脏页写入磁盘的机制和redo log的设置有关。
lru链表
  1. 当buffer pool所有数据页全部沾满之后,就应该存在一种机制进行淘汰;
  2. buffer pool中最近使用过的数据页,会被放置链表的头部,最少使用的放置链表尾部,所以最先淘汰的是链表尾部的控制块;
  3. 当buffer pool没有占满的时候,存在一些热数据经常被访问到的,但是偶尔出现一次全表扫描,那么将会清掉buffer pool中全部数据页(换血),包括热数据,那么问题就是:全盘扫描不是经常出现的,而那些热数据则是经常被访问,显然此时性能就下降了(因为还要再去磁盘获取数据到buffer pool中);
  4. 为解决3带来的问题,那么lru链表被分为两部分,如图所示。数据从磁盘获取后,先将数据加到冷数据区域的头部,当冷数据区域控制块对应的数据页连续两次访问时间大于1s时,就会将冷数据区域对应的数据页挪移到热数据区域的头部;
  5. 为什么是大于1s,举例说明:对于全盘扫描而言,某一数据页重复访问的时间远远小于1s。因为一个数据页存在多条数据记录,逐条扫描的时间很短。

继续阅读