美文网首页值得一看程序员
一看就懂的:MySQL数据页以及页分裂机制,别在说不会了

一看就懂的:MySQL数据页以及页分裂机制,别在说不会了

作者: 码上入坟 | 来源:发表于2020-11-26 16:42 被阅读0次

下面我们就一起看下,究竟什么是MySQL的数据页、数据区等概念。

二、数据页长啥样?

数据页长下面这样:

image.png

三、什么是数据区?

在MySQL的设定中,同一个表空间内的一组连续的数据页为一个extent(区),默认区的大小为1MB,页的大小为16KB。16*64=1024,也就是说一个区里面会有64个连续的数据页。连续的256个数据区为一组数据区。

于是我们可以画出这张图:

image

从直观上看,其实不用纳闷为啥MySQL按照这样的方式组织存储在磁盘上的数据。

这就好比你搞了个Java的封装类描述一类东西,然后再相应的给它加上一些功能方法,或者用golang封装struct去描述一类对象。最终的目的都是为了方便、管理、控制。

约定好了数据的组织方式,那MySQL的作用不就是:按照约定数据规则将数据文件中的数据加载进内存,然后展示给用户看,以及提供其他能力吗?

四、数据页分裂问题

假设你现在已经有两个数据页了。并且你正在往第二个数据页中写数据。

关于B+Tree,你肯定知道B+Tree中的叶子结点之间是通过双向链表关联起来的。

在InnoDB索引的设定中,要求主键索引是递增的,这样在构建索引树的时候才更加方便。你可以脑补一下。如果按1、2、3...递增的顺序给你这些数。是不是很方便的构建一棵树。然后你可以自由自在的在这棵树上玩二分查找。

那假设你自定义了主键索引,而且你自定义的这个主键索引并不一定是自增的。

那就有可能出现下面这种情况 如下图:

image

假设上图中的id就是你自定义的不会自增的主键

然后随着你将数据写入。就导致后一个数据页中的所有行并不一定比前一个数据页中的行的id大。

这时就会触发页分裂的逻辑。

页分裂的目的就是保证:后一个数据页中的所有行主键值比前一个数据页中主键值大。

经过分裂调整,可以得到下面的这张图。

image

相关文章

  • 一看就懂的:MySQL数据页以及页分裂机制,别在说不会了

    下面我们就一起看下,究竟什么是MySQL的数据页、数据区等概念。 二、数据页长啥样? 数据页长下面这样: 三、什么...

  • 第14期:数据页合并

    MySQL InnoDB 表数据页或者二级索引页(简称数据页或者索引页)的合并与分裂对 InnoDB 表整体性能影...

  • MySQL - InnoDB Buffer Pool

    简介 MySQL InnoDB 缓冲池,里面缓存着大量数据(数据页),使 CPU 读取或写入数据时,MySQL 不...

  • mysql脏页是什么?

    mysql脏页:当内存数据页和磁盘数据页上的内容不一致时,我们称这个内存页为脏页;内存数据写入磁盘后,内存页上的数...

  • mysql索引

    核心知识点 二叉搜索树、N叉树 页分裂:B+树的插入可能会引起数据页的分裂,删除可能会引起数据页的合并,二者都是比...

  • MySQL -- 数据页

    前言 最近在学MySQL,决定记录一下,能写多少写多少,不定时更新,加油。 正文 分几个部分来吧,大致如下: 字符...

  • 一行数据是怎么存储在磁盘的?

    MySQL物理数据模型 每一行数据都是放在数据页,按数据页为单位把磁盘上的数据加载到内存的缓存页里来,也是按照页为...

  • 为什么索引能提高查询速度

    MySQL 的基本存储结构 MySQL的基本存储结构是页(记录都存在页里边): 各个数据页可以组成一个双向链表 每...

  • MySQL架构体系设计深入剖析篇学习笔记

    MySQL存储引擎InnoDB原理拆解以及设计深度剖析 MySQL记录存储以Page(页)来划分。页头:记录页面的...

  • MySQL-脏页的刷新机制

    MySQL内存结构-缓冲区 MySQL的缓冲区中有数据页,索引页,插入缓冲等等,这个角度是从页的功能来分类的。本小...

网友评论

    本文标题:一看就懂的:MySQL数据页以及页分裂机制,别在说不会了

    本文链接:https://www.haomeiwen.com/subject/lzcziktx.html