前言

本文的观点是基于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. linux sort uniq命令详解

    sort 功能说明:将文本文件内容加以排序,sort可针对文本文件的内容,以行为单位来排序. sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+&l ...

  2. PYTHON3.4.4 升级pip

    python -m pip install --upgrade pipupgrade 前面是两个 "-" 

  3. C语言:位运算加密

    数据加密解密是一个常用的功能,如果你不希望让别人看到文件中的内容,可以通过密钥(也称"密码")将文件的内容加密.比如文本文件(.txt),加密前的内容是能够读懂的,加密后的内容是& ...

  4. clickhouse分布式集群

    一.环境准备: 主机 系统 应用 ip ckh-01 centos 8 jdk,zookeeper,clickhouse 192.168.205.190 ckh-02 centos 8 jdk,zoo ...

  5. POJ 树的直径和重心

    树的直径:(无根)树上最长两点间的最长路径,两次dfs即可,第一次dfs任选一点u,找到距离它最远的点s,再从点s进行一次dfs,找到距离s最远的点t,则s-t之间的路径就是树的直径.证明: < ...

  6. vlc+flv.js 摄像头 H5 直播

    背景 业务需求:用最短的时间搞定摄像头直播到Web页面.因为没有过这方面经验,所以走了很多弯路,其实也不算弯路吧,大部分时间花在学习基础概念,寻找快速方案中.惯性思维想当然的以为找组件,配地址就能搞定 ...

  7. 【开发工具】-- IDEA集成Git在实际项目中的运用

    1.企业实际项目中Git的使用 在实际的企业项目开发中,我们一般Java的项目在公司都有自己的局域网代码仓库,仓库上存放着很多的项目.以我工作过的公司如华为的项目,一般是存放在企业内部的CodeHub ...

  8. ThinkPHP3.2.3使用PHPExcel类操作excel导出excel

    如何导入excel请看:ThinkPHP3.2.3使用PHPExcel类操作excel导入读取excel // 引入PHPExcel类 import("Org.Util.PHPExccel& ...

  9. maven之---资源过滤 在java/main/resourse/*.xml ,*.properties引用maven属性${db.username}

    本文主要来源maven实战14.3 为了应对环境的变化,首先使用Maven属性将这个会发生变化的部分提取出来.在上一节的数据库配置中,连接数据库使用的驱动类,URL,用户名和密码都可能发生变化,因此使 ...

  10. videojs文档翻译-SeekBar

    SeekBar 拖动条和进度条的容器. 使用PlayProgressBar作为其栏. 构造函数 new SeekBar(player, optionsopt) 创造此类的实例 Parameters: ...