InnoDB逻辑存储结构

段—区—页—行

表空间:

默认情况下InnoDB有一个共享表空间ibdata1,所有数据放入这个表空间,如果开启了innodb_file_per_table(默认ON),每张表都可以放到一个单独的表空间,但只把数据、索引和Insert Buffer Bitmap放入单独表空间,其它数据,如undo信息、插入缓冲索引页、事务信息,二次写缓冲等还是放共享表空间

段:

表空间由各个段组成,数据段、索引段、回滚段等,数据段即B+树叶子节点索引段即B+树非叶子节点。每个段开始时,先用32个页大小的碎片页存放数据,使用完这些碎片页,再去一个区一个区地申请内存,这保证了小段如undo这样的段可以省空间

区:

区由连续的页组成,一个区固定是1MB,页默认16KB,即一个区有64个连续的页,InnoDB1.0.x引入压缩页,页的大小可以是2K、4K、8K,但不管怎么变,区都是1MB

页:

InnoDB磁盘最小的管理单位,默认16KB,InnoDB1.2.x开始可以更改默认大小innodb_page_size为4K、8K、16K,更改后,不得再次修改,除非mysqldump导入导出产生新的库

常见的页类型:

  • 数据页(B-tree Node)
  • undo页(undo Log Page)
  • 系统页(System Page)
  • 索引页(Index Page)
  • 事务数据页(Transaction system Page)
  • 插入缓冲位图页(Insert Buffer Bitmap)
  • 插入缓冲空闲列表页(Insert Buffer Free List)
  • 未压缩的二进制大对象页(Uncompresses BLOB Page)
  • 压缩的二进制大对象页(compressed BLOB Page)

行:

行存储有四种格式,Redundant、Compact、Dynamic和Compressed。MySQL5.1开始默认使用Compact,MySQL5.7开始默认使用Dynamic

​ Compact:

在这里插入图片描述

​ 变长字段长度列表:当数据表有变长字段时才出现,记录本行中各变长字段实际长度,当长度小于255时用1个字节表 示,大于255时用2个字节表示,不会用3个字节,因为变长字段有长度限制,最多65535字节

​ NULL标志位:当数据表存在允许NULL的字段时才出现,本行每个字段是否为null用0或1表示,同时必须是整数个字 节大小,即不足8个bit位的高位补0

​ 记录头信息:存储一些信息,固定5个字节,如delete_mask,标识删除位;next_record下条记录的地址; record_type,记录类型,0为普通,1为B+树非叶子节点,2为最小记录,3为最大记录

变长字段长度列表和NULL是逆序存储(方便寻址)

​ row_id:当建表时没指定主键时,选择第一个非空唯一索引当主键,如果没有,添加该列作为主键,6字节大小

​ trx_id:事务id,这条数据是哪个事务生成的,6字节大小

​ roll_ptr:上个版本的指针,7字节大小

​ 一个页最多有16KB,16384字节,而varchar(n)最多可以存储65533字节,那么一个页可能都放不了一条记录,这时就会行溢出,溢出的数据会放到“溢出页”中,原页会保留20个字节指向该溢出页的地址。

​ Compressed和Dynamic行格式和Compact非常相似,主要是行溢出时的处理,这两个不会在原页保存数据,只用20字节指针指向溢出页,数据全在溢出页,而Compressed还会对BLOB、TEXT、VARCHAR这些大长度类型的数据进行zlib算法压缩

char和varchar?

char存储固定长度字符串,最大长度255字节,当存储长度小于定义的长度时,MySQL在后面补空格(如果本身存储的字符串尾部就有空格,就会丢失空格信息!)

varchar存储可变字符串,读取速度相对更慢一点,因为需要先读长度,再读数据

一般使用varchar存储较好,但考虑到极端情况,varchar因为长度可变,可能出现页分裂的情况

如果是身份证号、订单号、国家编码等这些固定长度的,可以用char

如果是产品描述、用户地址、用户名称这种,可以用varchar

数据页结构:


在这里插入图片描述
在这里插入图片描述

采用链表的结构是让数据页之间不需要是物理上的连续的,而是逻辑上的连续。

数据页中的记录按照「主键」顺序组成单向链表,单向链表的特点就是插入、删除非常方便,但是检索效率不高,最差的情况下需要遍历链表上的所有节点才能完成检索。

因此,数据页中有一个页目录,起到记录的索引作用,就像我们书那样,针对书中内容的每个章节设立了一个目录,想看某个章节的时候,可以查看目录,快速找到对应的章节的页数,而数据页中的页目录就是为了能快速找到记录。

在这里插入图片描述

  • 将所有的记录划分成几个组,这些记录包括最小记录最大记录,但不包括标记为“已删除”的记录;
  • 每个记录组的最后一条记录就是组内最大的那条记录,并且最后一条记录的头信息中会存储该组一共有多少条记录,作为 n_owned 字段(上图中粉红色字段)
  • 页目录用来存储每组最后一条记录的地址偏移量,这些地址偏移量会按照先后顺序存储起来,每组的地址偏移量也被称之为槽(slot),每个槽相当于指针指向了不同组的最后一个记录。

从图可以看到,页目录就是由多个槽组成的,槽相当于分组记录的索引。然后,因为记录是按照「主键值」从小到大排序的,所以我们通过槽查找记录时,可以使用二分法快速定位要查询的记录在哪个槽(哪个记录分组),定位到槽后,再遍历槽内的所有记录,找到对应的记录,无需从最小记录开始遍历整个页中的记录链表。

  • 第一个分组中的记录只能有 1 条记录;
  • 最后一个分组中的记录条数范围只能在 1-8 条之间;
  • 剩下的分组中记录条数范围只能在 4-8 条之间。

索引:

在这里插入图片描述

索引页的行记录是指针,指向一个页,索引页的索引键值就是指向的页的最小索引键值

数据页的行记录就是数据(聚簇索引,如果是二级索引,存放的是主键值)

页合并和页分裂:

​ 页合并:

​ 当一个数据页的使用率低于一定阈值(50%)时,MySQL 就会将该页与相邻的空闲页合并成一个页面。

​ 例如,数据页能存放7条数据,有两个相邻的数据页,一个存储 [1, 2, 3, 4],另一个是[5, 6]。当删除4时,会检查 本页,本页数据只有三条,小于阈值,MySQL 就会将两个页面合并成一个页面,存储的数据变成 [1, 2, 3, 5, 6]

​ 页分裂:

​ 当一个数据页已经满了,而有新的数据要插入到该页时,MySQL 就会进行页分裂操作。

​ 例如,数据页能存放5条数据,假设一个数据页已经存储了 [1, 2, 3, 4, 5],而有新的数据6要插入到该页中, MySQL 就会将该页拆分为两个页面,一个页面存储 [1, 2, 3],另一个页面存储 [4, 5, 6]。

​ 页分裂是为了保证插入顺序的同时不大量挪动数据

​ 采用逻辑删除可以减少页合并

​ 采用批量顺序插入可以减少页分裂

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912044.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912044.shtml
英文地址,请注明出处:http://en.pswp.cn/news/912044.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[特殊字符] Python 批量合并 Word 表格中重复单元格教程(收货记录案例实战)

在日常办公中,Word 表格中常出现重复的“供应商名称”或“物料编码”,会导致表格冗余且视觉混乱。这时候,用 Python 自动合并重复单元格可以大幅提升表格专业度和可读性。本篇给大家演示如何用 python-docx 实现该功能。 ✅ 功能概览 自动读取…

从零构建Node.js服务托管前端项目

下面是一个完整的指南,教你如何从零开始构建一个Node.js服务来托管前端项目,并代理API请求到其他服务器。 1. 项目初始化 # 创建项目目录 mkdir node-proxy-server cd node-proxy-server# 初始化npm项目 npm init -y# 安装必要依赖 npm install expres…

Lynx vs React Native vs Flutter 全面对比:三大跨端框架实测分析

一文看懂三大热门跨端技术的历史渊源、架构机制、开发体验、包体积对比与性能评估。 我陪你用实测数据带你理性选型,不踩坑,不盲信。 1. 框架简介:它们是谁?来自哪里?干嘛用? 框架名称所属公司发布时间初衷…

CKESC的ROCK 180A-H 无人机电调:100V 高压冗余设计与安全保护解析

一、核心技术参数与性能指标 电压范围:支持 12~26S 锂电(适配 110V 高压系统)电流特性: 持续工作电流:90A(特定散热条件)瞬时耐流(1 秒):220A,3 …

优化 ArcPy 脚本性能

使用并行处理 如果硬件条件允许,可以使用 Python 的并行处理模块(如 multiprocessing)来同时处理多个小任务。这样可以充分利用多核处理器的优势,提高脚本的执行效率。 import multiprocessing def process_raster(raster):arcpy…

Windows下CMake通过鸿蒙SDK交叉编译三方库

前言 华为鸿蒙官方的文章CMake构建工程配置HarmonyOS编译工具链 中介绍了在Linux平台下如何使用CMake来配置鸿蒙的交叉编译环境,编译输出在Harmony中使用的第三方so库以及测试demo。 本文主要是在Windows下实现同样的操作。由于平台差异的原因,有些细节…

从C学C++(6)——构造函数和析构函数

从C学C(6)——构造函数和析构函数 若无特殊说明,本博客所执行的C标准均为C11. 构造函数与析构函数 构造函数定义 构造函数是特殊的成员函数,当创建类类型的新对象,系统自动会调用构造函数构造函数是为了保证对象的每个数据成员都被正确初…

清理 Windows C 盘该注意什么

C 盘空间不足会严重影响系统性能。 清理 C 盘文件时,首要原则是安全。错误地删除系统文件会导致 Windows 无法启动。下面我将按照 从最安全、最推荐到需要谨慎操作的顺序,为你详细列出可以清理的文件和文件夹,并提供操作方法。 第一梯队&…

Python Selenium 滚动到特定元素

文章目录 Python Selenium 滚动到特定元素⚙️ **1. 使用 scrollIntoView() 方法(最推荐)**🖱️ **2. 结合 ActionChains 移动鼠标(模拟用户行为)**🧩 **3. 使用坐标计算滚动(精确控制像素&…

你写的 Express 接口 404,可能是被“动态路由”吃掉了

本文首发在我的个人博客:你写的 Express 接口 404,可能是被“动态路由”吃掉了 前情提要 最近参与公司的一个项目前端 React,后端用的 Express。目前我就做一些功能的新增或者修改。 对于 Express ,本人没有公司项目实战经验&…

【Java面试】你是怎么控制缓存的更新?

🔄 一、数据实时同步失效(强一致性) 原理:数据库变更后立即失效或更新缓存,保证数据强一致。 实现方式: Cache Aside(旁路缓存): 读流程:读缓存 → 未命中则…

react-嵌套路由 二级路由

什么是嵌套路由? 在一级路由中又内嵌了其他路由,这种关系就叫做嵌套路由,嵌套至一级路由内的路由又称作二级路由 嵌套路由配置 实现步骤 配置二级路由 children嵌套 import Login from "../page/Login/index"; import Home from …

【CMake基础入门教程】第八课:构建并导出可复用的 CMake 库(支持 find_package() 查找)

很好!我们进入 第八课:构建并导出可复用的 CMake 库(支持 find_package() 查找)。 🎯 本课目标 你将掌握: 如何构建一个库并通过 install() 导出其配置; 如何让别人在项目中使用 find_package…

Jenkins与Kubernetes深度整合实践

采用的非jenkins-slave方式 jenkins配置: Jenkins添加k8s master节点的服务器信息 在Jenkins容器内部与k8s master节点设置免费登录 # docker过滤查询出运行的Jenkins服务 $ docker ps | grep jenkins# 进入Jenkins容器内部 $ docker exec -it jenkins-server /bi…

GraphQL API-1

简介 判断GraphQL方式 判断一个网站是否使用了GraphQL API,可以通过以下几种方法: 1. 检查网络请求 查看请求端点 GraphQL 通常使用单一端点,常见路径如: /graphql/api/graphql/gql/query 观察请求特征 POST 请求为主&…

推荐C++题目练习网站

LeetCode LeetCode是一个全球知名的编程练习平台,提供大量C题目,涵盖数据结构、算法、系统设计等。题目难度从简单到困难,适合不同水平的学习者。平台支持在线编写代码并即时运行测试,提供详细的题目讨论区和官方解答。 Codeforc…

Spring Cloud 微服务(服务注册与发现原理深度解析)

📌 摘要 在微服务架构中,服务注册与发现是整个系统运行的基础核心模块。它决定了服务如何被定位、调用和管理。 本文将深入讲解 Spring Cloud 中 Eureka 的服务注册与发现机制,从底层原理到源码分析,再到实际开发中的最佳实践&a…

【Linux 设备模型框架 kobject 和 kset】

Linux 设备模型框架 kobject 和 kset 一、Linux 设备模型概述二、kobject 与 kset 的核心概念1. kobject2. kset3. 关键数据结构 三、kobject 与 kset 的实现源码四、源码解析与使用说明1. kset 的创建与初始化2. kobject 的创建与属性3. sysfs 属性操作4. 用户空间访问示例 五…

一起学前端之HTML------(1)HTML 介绍

HTML 介绍 HTML 即超文本标记语言(HyperText Markup Language),它是构成网页的基础技术之一。HTML 借助各种标签(Tag)对网页的结构与内容加以描述。下面为你介绍其核心要点: 关键特性 标签结构&#xff…

整体迁移法迁移 Docker 镜像

docker添加了新的镜像数据盘,数据盘迁移步骤 使用整体迁移法迁移 Docker 镜像后,可以在确认迁移成功且新数据盘正常使用后,删除旧数据目录来释放空间1。 # 停止 Docker 服务 sudo systemctl stop docker # 停止 socket 监听器 sudo systemct…