Mysql 初始01

2021/7/19 19:06:06

本文主要是介绍Mysql 初始01,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

文章目录

  • 一、Page——页
    • 一、Page Directory(记录在页中的展现)
  • 二、B数 & B+树
    • 一、B树和B+树的区别
  • 三、Index——索引
    • 1、聚簇索引——主键
    • 2、二级索引——非主键
  • 缓冲池——Buffer Pool
  • 总结


一、Page——页

为了避免一条提条的读取磁盘的数据,InnoDB采取页的方式,作为磁盘和内存之间交互的基本方式

一个页的大小一般是16KB

InnoDB为了不同的目的而设计了多种不同类型的页:
1、存放表空间头部信息的页
2、粗放undo日志信息的页等…
把存放表中数据的页称为索引页或是数据页

								数据页结构

在这里插入图片描述

								数据页的头信息

在这里插入图片描述


在这里插入图片描述

一、Page Directory(记录在页中的展现)

在这里插入图片描述

最底层记录的特点
1、按照主键从小到大一次排序
2、单项列表

分组的规则
1、对于Infimum记录,组里只能有1条记录,就是本身
2、对于Supremum记录,组里只能有1-8条记录
3、对于其他的记录,组里面只能有4-8条记录

分组步骤
起初:没有记录,一个新的数据页有两个组,Infimum组1条记录,另一个是Supremum组1条记录
之后:插入数据的时候,往Supremum组里面插入,n_owned 加 一
最后:Supremum组满后,进行拆分,1个组拆分为2个组,申请新的槽位(Slot)

各个标志位的解释

  • deleted_flag

物理删除(delete语句删除数据)& 逻辑删除(is_deleted字段) 0:未删除, 1:已删除

为什么不直接删除? 性能消耗

删除操作:
1、把deleted_flag=1
2、把删除掉的记录,组成一个垃圾链表(目的:空间的可重用性)

  • min_rec_flag

B+树每层非叶子节点中标识最小的目录项记录

  • n_owned

把一个页划分成若干个组。一个组里的“大哥(组里面主键最大)”,会保存该值,该值标识一个组里有多少条记录

  • heap_no

堆号。每条插入进来的记录都会分配堆号。从heap_no=2开始

为什么从heap_no=2开始?
infimum的heap_no=0(默认) 第一条
Supremum的heap_no=1(默认)最后一条

  • record_type

记录类型
0:普通记录(插入的记录)
1:B+树非叶子节点目录项记录
2:表示infimum的记录
3:表示Supremum的记录

  • next_record

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


二、B数 & B+树

一、B树和B+树的区别

									B树

在这里插入图片描述

												B+树

在这里插入图片描述

  • B树和B+树的相同点

    • 一个节点可以存储多个元素
    • 与B树一样,叶子节点是排序
    • 每个节点中的元素,也都是按照从小到大的顺序排列,即左小右大
    • 所有的叶子节点都位于同一层,或者说根节点到每个叶子节点的长度都相同
    • 根节点元素个数: 1<= k <= m-1 (m表示阶数,即:一个节点最多有多少个子节点)
    • 非根节点元素个数:m/2 <= k <= m-1
  • B树和B+树的不同点

    • 叶子节点是有指针的,MySQL中采用双向指针
    • 非叶子节点的元素是与叶子节点有冗余的

三、Index——索引

B+树中,叶子节点里存储完整的数据(数据页)。非叶子节点,存储的主键索引(索引页)
在这里插入图片描述

1、聚簇索引——主键

聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。这个特性决定了索引组织表中数据也是索引的一部分

在这里插入图片描述


2、二级索引——非主键

根据实际情况自行添加的索引都是辅助索引,辅助索引就是一个为了需找主键索引的二级索引,先找到主键索引再通过主键索引找数据

在这里插入图片描述


缓冲池——Buffer Pool

mysql使用 Innodb作为存储引擎, 并且数据都是以页(page)的形式存储在表空间里,因为磁盘访问速度很慢,所以为了提高速度,当访问某个页上面的数据时 ,先将这个页的所有数据加载到内存中并且缓存起来就可以对数据进行读写操作了,下次再次访就不需要再去磁盘里找了,为了提高效率这个内存就是buffer pool 缓存池

在这里插入图片描述

1、缓存作用
2、关系:索引、数据————>页————> 磁盘
3、select * from user where id = 1; 查询一条记录,但是需要把该记录所在的页的所有记录都查询出来放入内存那种
4、如果查询数据不在一个页里,就会导致有大量的io操作

5、某一刻,会将脏页刷新到磁盘?什么情况下刷新?
1、 从flush链表中刷新一部分页面到磁盘
后台有线程,根据系统的繁忙程度来确定刷新的速率。BUF_FLUSH_LISH
系统很繁忙,照成我们刷新脏页到磁盘的速度很慢。没有可用的缓冲液。就会去查看LRU链表尾部,是不是存在直接释放掉的未修改的缓冲液。如果没有,不得不将LRU链表尾部的一个脏页同步刷新到磁盘中。BUF_FLUSH_SINGLE_PAGE
2、从LRU链表的冷数据汇总刷新一部分页面到磁盘 BUF_FLUSH_LRU

							flush链表

在这里插入图片描述

							LRU链表

在这里插入图片描述

总结

提示:



这篇关于Mysql 初始01的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程