前言

本文的观点是基于MySQL使用Innodb存储引擎的情况下进行的!

很多渠道说:MySQL数据按照主键大小依次排列,记录之间是双向链表连起来。如果说我告诉你这种说法很大程度上是错的,你肯定说我在胡扯。

正文

我们先看看MySQL的B+树索引结构是什么样的

是的,这种图和网上的很多图都是类似的,我们可以看到每个节点上会有多个记录或者数据,MySQL使用Innob引擎时,这个节点就代表的是Innodb页,Innodb页是最小的存储单元。

通过上图或者你以前就知道,一个Innodb页存储很多条数据。但是Innodb页可不只有数据记录,还会有其他数据。

上图就是Innodb页的结构图

同样每条记录也不单单只有数据本身,还包含其他额外的数据

其中额外信息中,有记录头信息部分,这部分到底长什么样呢

记录头占 5 个字节,40 位,下图是对应代表的含义

  • 1-2 位:预留,可以无视
  • 3 位:在记录刚被删除时,不是马上删掉,而是将其标记为已删除,实际还在占用空间
  • 4 位:最小目录项标记,B+树是非叶子节点(每个节点是一个 Innodb 页)内,最小目录项标记
  • 5-8 位:成员数量,Innodb 中,所有的记录间不是无关的,也是要再次分组的,这里表示一个组的组长。举个栗子,一个 Innodb 页好比军队的一个排长,下面每个班长都带个袖标,袖标上是班的人数
  • 9-21 位:相对位置,表示本记录在 Innodb 里的相对位置,可以简单的认为(不准确)在一个页里的第几条记录
  • 22-24 位:记录类型,一般记录类型为普通类型,值为 0
  • 25-40 位:下一条记录的相对位置,是指本记录距离下一条记录开头的真实位置,比如说,这里值为 64,就是从当前记录真实记录地址往后走 64 个字节,就是下一条记录的真实数据
    这里我们着重看一下下条记录的相对位置部分:什么是相对位置呢?简要回答就是我离你有多远,而不是起点离你有多远。放在MySQL里代表记录之间的距离。

下面我们借助另一张图看一下,看一下Innodb页中记录之间是怎么存储的

上图中我们看到,记录之间是亲密无间的排列的。那我们怎么找下一条记录呢,还是看上面的出现的一张图,里面的下条记录的相对位置

比如,记录1的中下条记录的相对位置为38,意味着从记录1的真实数据开始往后找38个字节就是下一条记录的真实数据的开始。如果记录1的下条记录的相对位置是-38,代表从记录1的真实数据部分往前找38个字节就是下一条记录的真实数据部分。

如果你了解数据结构,你一定明白,这特么就是链表啊!是的,Innodb页中的数据之间,是通过单向链表来实现的。

但是,Innodb页之间是双向链表关联的。

一个Innodb页中的文件头中有这么两个属性:上一页的页号、下一页的页号

所以MySQL叶子节点之间是通过双向链表完成的。

因此:记录间可以说是既有单向链表又有双线链表。

MySQL记录之间是单向链表还是双向链表?的更多相关文章

  1. Python 单向链表、双向链表

    用面向对象实现Linkedlist链表 单向链表实现append.iternodes 双向链表实现append.pop.insert.remove.iternodes 单向链表与双向链表 单向链表: ...

  2. JS实现单向链表、双向链表、循环链表

    https://cloud.tencent.com/developer/article/1114246 链表存储有序的元素的集合,但是和数组不同的是,链表中的元素在内存中的存储并不是连续的.每一个链表 ...

  3. Python链表的实现与使用(单向链表与双向链表)

    参考[易百教程]用Python实现链表及其功能 """ python链表的基本操作:节点.链表.增删改查 """ import sys cl ...

  4. 用Python写单向链表和双向链表

    链表是一种数据结构,链表在循环遍历的时候效率不高,但是在插入和删除时优势比较大. 链表由一个个节点组成. 单向链表的节点分为两个部分:存储的对象和对下一个节点的引用.注意是指向下一个节点. 而双向链表 ...

  5. Java-链表(单向链表、双向链表)

    Java-链表 1.什么是链表? 2.链表的特点是什么? 3.链表的实现原理? 4.如何自己写出一个链表? 1.什么是链表? 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过 ...

  6. 《Java数据结构》链表结构(单向链表,双向链表)

    单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始:链表是使用指针进行构造的列表:又称为结点列表,因为链表是由一个个结点组装起来的:其中每个结点都有指 ...

  7. Java 中的 LinkedList 是单向链表还是双向链表?

    是双向链表,你可以检查 JDK 的源码.在 Eclipse,你可以使用快捷键 Ctrl + T, 直接在编辑器中打开该类.

  8. 玩转C线性表和单向链表之Linux双向链表优化

    前言: 这次介绍基本数据结构的线性表和链表,并用C语言进行编写:建议最开始学数据结构时,用C语言:像栈和队列都可以用这两种数据结构来实现. 一.线性表基本介绍 1 概念: 线性表也就是关系户中最简单的 ...

  9. 数据结构与算法——链表 Linked List(单链表、双向链表、单向环形链表-Josephu 问题)

    链表是有序的列表,但是在内存中存储图下图所示 链表是以 节点 的方式来存储,是 链式存储 每个节点包含 data 域.next 域,指向下一个节点 链表的各个节点 不一定是连续存储,如上图所示 链表还 ...

随机推荐

  1. php 基于redis使用令牌桶算法 计数器 漏桶算法 实现流量控制

    通常在高并发和大流量的情况下,一般限流是必须的.为了保证服务器正常的压力.那我们就聊一下几种限流的算法. 计数器计数器是一种最常用的一种方法,在一段时间间隔内,处理请求的数量固定的,超的就不做处理. ...

  2. 第二章 python基本语法元素

    python有两种编程方式,交互式和文件式. 交互式:对每个输入语句即时运行结果------适合语法练习 文件式:批量执行一组语句并运行结果------编程的主要方式 实例1:圆面积的计算(根据半径r ...

  3. 安装PyTorch后,又安装TensorFlow,CUDA相关问题思考

    下面的话是我的观察和思考,请多多批评. TensorFlow 要用 CUDA.CUDA toolkit.CUDNN,看好版本的对应关系再安装,磨刀不误砍柴工. 1)NVIDIA Panel 里显示的N ...

  4. Java | Random 和 Math 的概述及使用

    Random Random类是java.util的包里面提供的我们常用的API,方便我们操作的,还有非常多像Random一样的类. Random的作用 生成一个随机数字,可以指定范围,也可以真的随机. ...

  5. JS中 var,let与const的区别

    1.在ES6(ES2015)出现之前,JavaScript中声明变量就只有通过 var 关键字,函数声明是通过 function 关键字,而在ES6之后,声明的方式有 var . let . cons ...

  6. Pycharm上python运行和unittest运行两种执行方式解析

    前言 经常有人在群里反馈,明明代码一样的啊,为什么别人的能出报告,我的出不了报告,为什么别人运行结果跟我的不一样啊... 这种问题先检查代码,确定是一样的,那就是运行姿势不对了,一旦导入unittes ...

  7. C语言:输出数字各个位的数字及和

    #include <stdio.h> int main() { char sh[13][5]={"个","十","百",&quo ...

  8. java常见的面试题(二)

    1.mybatis 中 #{}和 ${}的区别是什么? #{}是预编译处理,${}是字符串替换: Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的 ...

  9. JavaScript之DOM、DOM树

    一 DOM JavaScript操作网页的接口,全称为"文档对象模型"(Document Object Model). 有这几个概念:文档.元素.节点 整个文档是一个文档节点 每个 ...

  10. 构建前端第9篇之(下)---vue3.0将template转化为render的过程

    vue3.0将template转化为render的过程 这里是简单标记下,如何将.vue转换成js文件 具体的,先不研究了,太深,能力有限,达不到呢