MySQL记录之间是单向链表还是双向链表?
前言
本文的观点是基于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记录之间是单向链表还是双向链表?的更多相关文章
- Python 单向链表、双向链表
用面向对象实现Linkedlist链表 单向链表实现append.iternodes 双向链表实现append.pop.insert.remove.iternodes 单向链表与双向链表 单向链表: ...
- JS实现单向链表、双向链表、循环链表
https://cloud.tencent.com/developer/article/1114246 链表存储有序的元素的集合,但是和数组不同的是,链表中的元素在内存中的存储并不是连续的.每一个链表 ...
- Python链表的实现与使用(单向链表与双向链表)
参考[易百教程]用Python实现链表及其功能 """ python链表的基本操作:节点.链表.增删改查 """ import sys cl ...
- 用Python写单向链表和双向链表
链表是一种数据结构,链表在循环遍历的时候效率不高,但是在插入和删除时优势比较大. 链表由一个个节点组成. 单向链表的节点分为两个部分:存储的对象和对下一个节点的引用.注意是指向下一个节点. 而双向链表 ...
- Java-链表(单向链表、双向链表)
Java-链表 1.什么是链表? 2.链表的特点是什么? 3.链表的实现原理? 4.如何自己写出一个链表? 1.什么是链表? 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过 ...
- 《Java数据结构》链表结构(单向链表,双向链表)
单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始:链表是使用指针进行构造的列表:又称为结点列表,因为链表是由一个个结点组装起来的:其中每个结点都有指 ...
- Java 中的 LinkedList 是单向链表还是双向链表?
是双向链表,你可以检查 JDK 的源码.在 Eclipse,你可以使用快捷键 Ctrl + T, 直接在编辑器中打开该类.
- 玩转C线性表和单向链表之Linux双向链表优化
前言: 这次介绍基本数据结构的线性表和链表,并用C语言进行编写:建议最开始学数据结构时,用C语言:像栈和队列都可以用这两种数据结构来实现. 一.线性表基本介绍 1 概念: 线性表也就是关系户中最简单的 ...
- 数据结构与算法——链表 Linked List(单链表、双向链表、单向环形链表-Josephu 问题)
链表是有序的列表,但是在内存中存储图下图所示 链表是以 节点 的方式来存储,是 链式存储 每个节点包含 data 域.next 域,指向下一个节点 链表的各个节点 不一定是连续存储,如上图所示 链表还 ...
随机推荐
- Linux创建ftp并设置权限以及忘记ftp帐号(密码)修改 (转)
忘记ftp密码修改方法:1.登录服务器 cd /etc/vsftpdcat ftpusers找到对应的ftp用户名 (如果用户名也忘记了 那么 cd /etc 然后cat passwd 查看用户 ...
- 不安装任何软件或脚本使用powershell快速计算文件的MD5/SHA1/SHA256等校验值
有的时候在检查升级过程中需要对xml文件进行签名,而xml文件中一般都需要包含安装包的SHA256值,这里分享一个使用PowerShell快速计算SHA256等其他值的方法. 一.在需要计算文件SHA ...
- python 17篇 unittest单元测试框架
单元测试:开发程序的人自己测试自己的代码 unittest自动化测试框架 1.单元测试 import unittest def add(a,b): return a+b # 在运行时不要用run un ...
- c语言:随机函数应用
#include <stdio.h> #include <time.h>//声明time 时间不可逆转一直在变 #include <math.h> #include ...
- 前端性能优化实践-gzip
一名优秀的前端工程师必备技能之一就是要会性能监控,并且能相应的进行性能优化.最近,有需求将项目做一些优化,提升用户的体验.看了一下项目并没有开启gzip,于是着手实现gzip压缩,下面就是具体的实践过 ...
- Dijkstra和堆优化
Dijkstra算法 由于我之前一直记的迪杰斯特拉的翻译导致我把dijkstra写成了dijstra--所以下文#define dijstra dijkstra 我以后叫她迪杰克斯歘! Dijskra ...
- windows系统pycharm终端更改为git bash
引自:https://blog.csdn.net/u011519550/article/details/89855122 设置路径:file--setting--tools--terminal--ap ...
- C++模板封装Win32 API 动态调用
起因 花两周通读了一遍<C++ Primer>,积攒的疑惑一扫而光. 前因 利用C++11可变模板,封装调用dll导出函数 本以为已经很好用了,最近抽时间巩固下知识体系,发现自己道行不够! ...
- Maven国内仓库
由于国外的官方Maven仓库比较慢,所以寻找国内的代理仓库. 网上找了一些博客,内容都是一模一样,并且不贴代理官方的说明. 我在阿里云的Maven仓库找到了官方说明. 下面直接贴配置指南: 配置指南 ...
- Zabbix中Agent自动注册
目录 Active agent自动注册 以下情况,自动注册会自动运行: 配置 服务端配置 客户端配置 Active agent自动注册 zabbix Active agent可以实现自动注册,进而服务 ...