高级篇七、InnoDB数据存储结构

news2024/10/3 0:25:04

1、数据库的存储结构: 页

在这里插入图片描述

1.1 磁盘与内存交互的基本单位:页

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

在这里插入图片描述

1.2 页结构概述

  • 页a,页b,页c … 页n 这些页可以不在物理结构上相连,只要通过双向链表相关联即可
  • 每个数据页中的记录会按照主键值从小到大的顺序组成一个单项链表
  • 每个数据页都会为存储在它里面的记录生成一个页目录,通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽
    然后再遍历该槽对应分组中的记录即可快速找到指定的记录

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

2、 页的内部结构

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

2.1 File Header(38字节 文件头部) + File Trailer(8字节 文件尾部)

2.1.1 File Header文件头

作用: 描述页的各种通用信息(比如页的编号、其上一页、下一页是谁等)
在这里插入图片描述

  • FIL_PAGE_OFFSET(4字节)
    每个页都有一个单独的页号,就像跟你的身份证号码一样,InnoDB通过页号可以唯一确定一个页

  • FIL_PAGE_TYPE(2字节)
    代表当前页的类型
    在这里插入图片描述

  • FILE_PAGE_PREV(4字节)和 FIL_PAGE_NEXT(4字节)
    InnoDB都是以页为单位存放数据的,如果数据分散到多个不连续的页中存储的话需要把这些页关联起来,FIL_PAGE_PREV和FIL_PAGE_NEXT就分别代表本页的上一个和下一个页的页号(也就是双向链表)
    在这里插入图片描述

  • FIL_PAGE_SPACE_OR_CHKSUM (4字节)
    代表当前页面的校验和(checksum)

什么是校验和?
就是对于一个很长的字节串来说,我们会通过某种算法来计算一个比较短的值来代表这个很长的字符串,这个比较短的值就称为校验和
在比较两个很长的字节串之前,先比较这两个长字节串的校验和,如果校验和都不一样,那么两个长字节串肯定是不同的,所以直接省去了直接 比较两个比较长的字节串的时间损耗

文件头部和文件尾部都有属性:FIL_PAGE_SPACE_OR_CHKSUM
作用:
InnoDB存储引擎以页为单位把数据加载到内存中处理,如果该页中的数据在内存中被修改了,那么在修改后额某个时间需要把数据同步到磁盘中。但是在同步了一般的时候断电了,造成了改页的传输的不完整

在这里插入图片描述

  • FIL_PAGE_LSN(8字节)
    Log Sequence Number : 页面最后修改时对应的日志序列位置

2.1.1 File Trailer文件尾

在这里插入图片描述

2.2 Free Space(空闲空间)+ User Record(用户记录)+ Infimum Supermum(最小最大记录)

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

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

2.3 Page Directory(页目录) + Page Header(页面头部)

2.3.1 Page Directory(页目录)

1、页目录中分组的个数如何确定?

2、页目录下如何快速查找记录?

Page Header(页面头部)

在这里插入图片描述

3、InnoDB行格式

3.1 指定行格式语法

在创建或修改表的语句中指定行格式:

CREATE TABLE 表名 (列的信息) ROW_FORMAT=行格式名称
ALTER TABLE 表名 ROW_FORMAT=行格式名称

举例:
mysql> CREATE TABLE record_test_table (
    ->     col1 VARCHAR(8),
    ->     col2 VARCHAR(8) NOT NULL,
    ->     col3 CHAR(8),
    ->     col4 VARCHAR(8)
    -> ) CHARSET=ascii ROW_FORMAT=COMPACT;

查看MySQL8默认的行格式

select @@innodb_default_row_format;
或者
show table status like 表名

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

3.2 COMPACT 行格式

3.2.1 变长字段长度列表

在这里插入图片描述

3.2.2 Null值列表

在这里插入图片描述

3.2.3 记录头信息

在这里插入图片描述

3.2.4 记录真实数据

在这里插入图片描述

3.2.5 记录真实数据

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

3.3 Dynamic和Compressed行格式

3.3.1 行溢出

我们可以知道一个页的大小一般是16KB,也就是16384字节,而一个VARCHAR(M)类型的列就最多可以存储65533个字节,这样就可能出现一个页存放不了一条记录,这种现象称为行溢出

3.3.2 Dynamic和Compressed行格式

3.4 Redundant行格式

4、区、段和碎片区

4.1 为什么需要区?

在这里插入图片描述

4.2 为什么要有段

在这里插入图片描述

4.3 为什么要碎片区

在这里插入图片描述

4.4 区的分类

在这里插入图片描述

5、表空间

在这里插入图片描述

5.1 独立表空间

在这里插入图片描述
查看 InnoDB的表空间类型

show variables like 'innodb_file_per_table';

on表示开启独立表空间
在这里插入图片描述

5.2 系统表空间

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt5.12实战之图形编程初识

演示效果: 1.绘制条件: 1. 绘图设备-> QPainter 2.画笔->QPen --->字体 (QFont) 3.画刷->QBrush-->自己定义画刷(QPixmap) 4.绘制事件->QPaintEvent 绘图步骤: 1.重写基类的虚函数 void paintEvent(QPaintEvent *event); 2.在虚函数 void paintEvent…

C++---状态压缩dp---愤怒的小鸟(每日一道算法2023.4.19)

注意事项: 难度警告!这题在NOIP中也算偏难的题,量力而行。 本题为"状态压缩dp—最短Hamilton路径"的扩展题,建议先阅读这篇文章并理解。 本题是"重复覆盖问题"可以使用"Dancing Links"做&#xff0…

MySql-高级( 面试问题简析) 学习笔记

文章目录 1. MySql 中 MyISAM 和 InnoDB 存储引擎区别1.1. MyISAM1.2. InnoDB 2. 索引的数据结构2.1. B Tree索引2.2. BTree索引2.3. MySql 做的优化 3. 为什么使用BTree索引而不使用Hash索引?4. 为什么使用BTree索引而不使用B-Tree索引?5. MyISAM 存储引…

检测并打印C++编译器支持的feature(附Visual Studio 2022测试结果)

C标准快速迭代,不同的系统平台和编译器对C各种新功能的支持不同,通过这个程序可以测试所用编译器对各个版本C的支持情况。另一方面,可以在代码中通过这些宏针对不同版本编写不同的代码分支。 源码下面附上Visual Studio 2022的测试结果&#…

【字符串处理】

目录 总结: 只要一做字符串的题目必出bug, 本蒟蒻还是要开个专题写一下……懒狗直接引用chatgpt 在C中,我们可以使用以下几种方式进行字符串的输入: 1.使用输入运算符(>>): 可以按照空格分隔符把一个标准字符串(即不包含…

引用的底层原理(汇编指令),引用与指针的联系与区别

TIPS 2. 3. 4. 引用的底层本质 在语法层面上的话,这个引用是不开空间的,相当于是对一个变量进行一个取别名的这么一个操作。在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。然而如果你从底层的角度去看的话,因…

两小时让你全方位的认识文件(完结)

上期阿博给友友们讲了一些关于文件的一些读写操作,这期给友友们分享一下二进制的方式和文件操作的一些误区,下面来跟着阿博走进文件吧🤗🤗🤗 文章目录 一.fread和fwrite功能介绍二.文件的随机读写三.文本文件和二进制文…

17.网络爬虫—Scrapy入门与实战

这里写目录标题 Scrapy基础Scrapy运行流程原理Scrapy的工作流程Scrapy的优点 Scrapy基本使用(豆瓣网为例)创建项目创建爬虫配置爬虫运行爬虫如何用python执行cmd命令数据解析打包数据打开管道pipeline使用注意点 后记 前言: 🏘️🏘️个人简介…

第一章Git学习(尚硅谷新版Git快速入门)

文章目录 为什么要学习Git为什么要学习Git软件为什么要学习Git软件Git基础概念版本控制集中式、分布式版本控制的区别Git工作区域Git分支 版本号什么是版本号文件操作对应的版本号分支操作对应的原理 命令行操作Git相关配置的指令获取当前Git的配置信息名称和邮箱 Git文件操作相…

随笔-你买罐头干什么

生产环境不太稳定,正在挠头,想着怎么能解决这个问题。 聊天工具上突然弹出一张图片,是个不认识的人(暂且称为Z)发的。点进去一看,是从一个表格截取的一条数据,内容是我某次加班餐的订单。 Z&a…

带头单向链表源码及相关练习

目录 移除链表元素 链表的中间节点 链表倒数第k个节点 合并两个有序链表 相交链表 环形链表 环形链表2 分割链表 回文链表 public class MySingleList {//内部类的使用class ListNode {public int val;public ListNode next;public ListNode(int val) {this.val val;}…

Java基础:容器知识点

目录 1、Java容器都有哪些? 2、Collection 和 Collections 区别? 3、List、Set、Map 间的区别? 4、HashMap 和 Hashtable 区别? 5、如何决定用 HashMap 还是 TreeMap? 6、HashMap 的实现原理? 7、说…

浮点型在内存中的存储

常见的浮点数: 3.14159 1E10(科学计数法:1.0*10^10) 浮点数家族包括: float、double、long double 类型 浮点数表示的范围:float.h中定义 下面举一个例子: int main() {int n 9;float *pFloat…

动态规划专练(一)

文章目录 前言一、斐波那契数1.题目介绍2.思路3.代码 二、爬楼梯1.题目介绍2.思路3.代码 三、使用最小花费爬楼梯1.题目介绍2.思路3.代码 前言 此篇为动态规划的初阶篇,所以比较简单,适合刚入门的新手学,如果你已经入门了,就无需看…

[LeetCode]杨辉三角

给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上…

(三)Python-tkinter桌面应用(爱心雨)

(三)Python-tkinter桌面应用(爱心雨) 一、前言 我们已经了解到tkinter可以制作爱心,弹幕,为了能让他看起来更加的充满心意,于是,我们决定将他制作为爱心雨。让它看起来更加的特别&a…

字节测试总监深度剖析,都2023年了,测试用例还不重视起来

​ 测试用例对于测试工作的作用: 1、指导测试的实施 测试用例主要适用于集成测试、系统测试和回归测试。在实施测试时测试用例作为测试的标准,测试人员一定要按照测试用例严格按用例项目和测试步骤逐一实施测试。并对测试情况记录在测试用例管理软件中…

超长JVM总结,面试必备

目录 什么是JVM JVM内存区域 JVM运行时内存(jdk1.7) 垃圾回收与算法 分代收集算法 GC 分代收集算法 VS 分区收集算法 GC 垃圾收集器 什么是JVM JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,…

ChatGPT已死?AutoGPT太强?

今天聊聊 AutoGPT。 OpenAI 的 Andrej Karpathy 都大力宣传,认为 AutoGPT 是 prompt 工程的下一个前沿。 近日,AI 界貌似出现了一种新的趋势:自主人工智能。 这不是空穴来风,最近一个名为 AutoGPT 的研究开始走进大众视野。特斯拉…

PYTHON中的常见离散分布

1.什么是伯努利分布? 伯努利分布是一种二元随机变量的概率分布,其中一个结果的概率为p,另一个结果的概率为1-p。伯努利分布通常用于模拟二项分布,其中n个独立的伯努利试验被执行,每个试验有两个可能的结果&#xff08…