第16章:InnoDB数据存储结构

news2024/12/22 18:37:27

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

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

InnoDB将表中数据划分多个页来存储,InnoDB中页的大小默认是16KB

在数据库中,不论读一行,还是读多行,都是将这些行所在的页从磁盘加载到内存。数据库管理存储空间的单位是页,数据库I/O操作的最小单位是页。一个页可以存储多个行记录。数据库的读取是以为单位。

 2.页结构概述

页a,页b,页c这些页是双向链表连接,逻辑上是连续的。每个数据页根据页中记录按照主键值从小到大顺序组成单链表,每个数据页会为记录生成页目录,在通过主键查找记录的时候在页目录使用二分法快速定位对应的槽,然后遍历该槽对应分组的记录

3.页的大小

在MySQL数据库中,页的大小是16KB

mysql> show variables like '%innodb_page_size%';

4.页的上层结构

 

①区:页的上层结构是区,一个区分配64个连续的页。64*16=1024KB=1M

②段:有一个或多个区组成。段是数据库中的分配单位,不同类型的数据库对象以不同的段形式存在。

③表空间:是一个逻辑容器,表空间存储的对象是段,在一个表空间中可以有一个或多个段,但是一个段只能属于一个表空间。数据库由一个或多个表空间组成,表空间从管理上可以划分为系统表空间、用户表空间、撤销表空间、临时表空间等。

二、页的内部结构

1.页的概念

页按照类型划分,常见是数据页(B+树)系统页Undo事务数据页

数据页的16kb的存储空间的划分:

 各部分的作用:

 2.第1部分:文件头和文件尾

①文件头作用

描述各种页的通用信息,比如页的编号,上一页,下一页

②文件头的结构

FIL_PAGE_OFFSET

存放页号的

FIL_PAGE_TYPE

当前页的类型

FIL_PAGE_PREV和FIL_PAGE_NEXT

上一页的页号,下一页的页号

FIL_PAGE_SPACE_OR_CHKSUM

代表校验和

为了检测修改后的页是否完整(断电了,可能页不完整)。每当一个页在内存中修改,同步之前就把它的校验和计算出来。开始先写入文件头的校验和,当完全写完了,最后会写入文件尾的校验和。比较文件头和文件尾的校验和,如果两个相等,那么同步成功。不相等说明同步中间出错(有记录,继续刷盘。没有记录,回滚)。校验方式就是采用Hash 算法进行校验。

FIL_PAGE_LSN

页面修改时的日志文件。

③文件尾的结构

校验和+LSN页面修改时的日志文件

3.第2部分:空闲空间,用户记录,最大最小记录

空闲空间

每当插入一条记录,都会从空闲空间部分申请一个空间存储用户记录。当空闲空间没有了,意味着页满了,新记录的插入需要新的页了。

用户记录

将用户数据按照指定的行格式一条一条存储在用户记录部分,相互之间是单链表。记录头信息

用户记录的单链表的形成:(记录头信息)Compact

①创建表

 

 ②表中记录的行格式

 ③记录头信息的属性

 ④插入数据

'

 图示

 

⑤记录头信息属性讲解

delete_mash:0代表没删除,1代表删除。删除的信息实际上还在磁盘,只是打上一个删除标记。因为移除需要重新排列,导致性能下降。但是新插入的记录可以占用此空间。

min_rec_mask:非叶子节点(目录项的页)最小的主键值记录是1。

record_type:0是用户记录,1是目录项记录,2最小记录,3最大记录

heap_no:当前记录本页的位置。heap_no是0最小记录的,heap_no是1最大记录。所以从2开始

n_owned:页目录每个组多少条记录

next_record:指向的下一条记录,单链表(真实记录的地址偏移量)第一条记录的next_record值为32,意味着从第一条记录的真实数据的地址处向后找32个字节便是下一条记录的真实数据

最小最大记录

比较的主键的大小,这两条记录不是我们自己定义的记录

 

4.第3部分:页目录,页面头部

页目录

①为什么需要页目录?

在页中,记录是单链表存储的,单链表的特点是插入,删除效率高。但是查找效率低,最差的情况是遍历链表所有的节点才能完成查找。所以,在页中设计了页目录(存储主键的数组),专门给记录做了一个目录,二分查找进行查找,提高效率。

②根据主键值查找页中的某条记录,如何实现快速查找?

通过页目录查找(页目录存放的是把记录分好组的最大主键值,分组为了减少存储空间)

实现:先把记录(删除的除外)分好组,第1组是最小记录分组,最后一组是最大记录分组,中间其余的组4-8条记录。组中最后一个记录头信息n_owned记录组中的多少条记录。页目录存储的是每组最后一条记录的地址偏移量,存放到slot槽中。

也就是:通过二分法定位记录所在的槽,找到槽所在分组主键最小的那条记录。

通过记录的next_record属性遍历该槽所在组的各个记录。

页头PageHeader

记录数据页存储记录的状态信息:本页存储了多少记录,多少个槽。

5.从数据页角度看B+树如何查询?

B+树按照节点类型:

叶子节点,B+树最底层节点,节点高度0,存储行记录

非叶子节点:存储索引和页面指针

 

问题1:树是如何进行数据检索的?

先从B+树的根开始,逐层检索。直到找到叶子节点,把对应的数据页加载到内存,通过对页目录进行二分查找记录所在的组,然后在分组中通过链表遍历方式查找记录。

问题2:普通索引和唯一索引有什么不同

普通索引和唯一索引在检索效率上基本没有区别。唯一索引是关键字没有重复的,找到了关键字就停止检索。普通索引的关键字可以重复,但是读取一条记录当把这个记录所在的页加载到内存,一个页存在上千条记录,普通索引多判断下一条记录的操作。普通索引和唯一索引在检索效率上基本没有区别。

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

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

相关文章

自动化测试,B、C接口要将A接口返回的参数作为入参,有哪些方法?

在进行自动化测试时,如果需要将A接口返回的参数作为B、C接口的入参,可以通过以下几种方法实现: 如果你想学习自动化测试,我这边给你推荐一套视频,这个视频可以说是B站百万播放全网第一的自动化测试教程,同…

PyTorch 深度学习 || PyTorch 编程基础

PyTorch 编程基础 文章目录 PyTorch 编程基础1. backword 求梯度2. 常用的激活函数2.1 Sigmoid 函数2.2 ReLu 激活函数2.3 Leakly ReLu 激活函数 2. 常用损失函数2.1 均方误差损失函数2.2 L1范数误差损失函数2.3 交叉熵损失函数 3. 优化器 1. backword 求梯度 import torchw …

(十)服务器K8S集群部署SpringBoot项目实战

1.准备springboot项目 可以在 https://start.spring.io/网站准备一个项目,这里作为k8s的学习所以springboot项目中准备一个简单的访问接口即可。 2.服务器环境准备 安装Jdk 1.更新系统软件包: sudo yum update2.安装 OpenJDK 11: sudo…

陶瓷板视觉检测系统和运动控制有什么联系?

陶瓷板视觉检测系统是一种利用现代计算机视觉技术对陶瓷板进行缺陷检测的设备,而运动控制则是一种控制运动的技术,两者之间存在着密切的联系。下面我们将详细介绍陶瓷板视觉检测系统和运动控制之间的联系。 一、陶瓷板视觉检测系统 陶瓷板视觉检测系统…

Redis面试核心技术点和缓存相关问题

目录 Redis的数据结构和原理 Redis持久化:RDB和AOF Redis的集群设计 缓存雪崩、击穿、穿透 高并发场景下缓存和数据库更新策略 Redis的大key和热key和大value 本地缓存 磁盘IO和网络开销 相比于 请求内存IO 要高上千倍,如果某个数据从数据库磁盘读…

第17章:存储引擎

一、查看存储引擎 1.什么是存储引擎 MySQL的存储引擎就是表的类型 2.查看mysql存储引擎 show engines; 二、设置系统默认的存储引擎 1.查看默认的存储引擎 select default_storage_engine; 2.修改默认存储引擎 set default_storage_engineMyISAM; 三、设置表的存储引擎 …

微信小程序开发之云函数本地调试

环境 微信开发者工具 Stable 1.06.2303220云开发控制台 v1.5.47 简介 微信云开发提供了云函数本地调试功能,在本地提供了一套与线上一致的 Node.js 云函数运行环境,让开发者可以在本地对云函数调试: 在本地调试时,可以设置断点…

【MD5知识详解】【面试知识】

MD5概述: MD5消息摘要算法,属Hash算法一类。MD5算法对输入任意长度的消息进行运行,产生一个128位的消息摘要(32位的数字字母混合码)。 MD5主要特点: 不可逆,相同数据的MD5值肯定一样,不同数据的MD5值不一样 (一个MD5理…

微信小程序nodejs+vue个人身体健康管理系统56b65

开发语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode 。配置文件 (自动编号、配置参数值、配置参数名称); 论坛交流 (自动编号、用户id、状态、父节点id、帖子标题、用户名…

ndoejs基于Vue.js二手书交易网站系统x3oh4

开发语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode 本毕业设计的内容是设计并且实现一个基于vue框架的二手书交易系统。它是在Windows下,以MYSQL为数据库开发平台&#xf…

chatgpt赋能python:Python取消warning指南:如何避免和处理警告

Python取消warning指南:如何避免和处理警告 如果您已经在使用Python编程,那么您一定会遇到过警告(warning)这个问题。虽然警告有时可能很有用,但在特定情况下,它们可能会引起程序错误或产生意想不到的行为…

Depcheck 检查前端项目中未使用的依赖包

前言 随着前端项目的迭代,项目中一部分的依赖包可能没被项目所使用的,手动查找这些依赖包耗时又繁琐,有没有根据能够快速的帮助我们识别和清理项目中未使用的依赖包呢? Depcheck 简介 Depcheck 是一款用于分析项目中依赖关系的…

windows下的SVN客户端访问ubuntu下的SVN服务器

目录 第一部分 windows创建本地版本库、连接ubuntu的SVN服务器 步骤0: 步骤一:创建windows本地版本库 步骤二:checkout检测 步骤三:输入之前配置的用户名和密码 第二部分 windows上传文件至SVN服务器 步骤一:添加…

Python数据攻略-DataFrame的创建与基础特性

大家好,我是Mr数据杨,今天我带来的是一本既实用又有趣的Python教程笔记,主角是Pandas DataFrame。它就像《三国演义》中的诸葛亮,机智、实用,可以帮助我们轻松处理各种数据问题。 我们来看如何创建诸葛亮——这个Data…

实现UDP通信(socket接口函数扩展)

一、write/read到send/recv 函数原型: ussize_t send(int sockfd, const void *buf, size_t len, int flags);//发送 ussize_t recv(int sockfd, void *buf, size_t len, int flags);//接收 前三个参数同read/write一样; ussize_t read(int fd, voi…

2023CCPC河南省赛 VP记录

感觉现在的xcpc,风格越来越像CF,不是很喜欢,还是更喜欢多点算法题的比赛 VP银了,VP银也是银 感觉省赛都是思维题,几乎没有算法题,感觉像打了场大型的CF B题很简单没开出来,一直搞到最后&…

Android crash 流程详解(二):NE

源码基于:Android R 接上一篇博文:《Android crash 流程详解(一):JE》 0. 前言 在上一篇博文剖析了java layer exception 的处理流程,本文将继续剖析 Android crash 的另一部分,即 native 端的 crash,又称…

【JavaEE】网络编程之UDP套接字

目录 1、网络编程基础 2、UDP数据报套接字编程 2.1.DatagramSocket API(方法) 2.2、DatagramPacket API(方法) 2.3、InetSocketAddress API 3、基于UDP socket写一个回显服务器 3.1、服务器端 3.2 、客户端 3.3、完…

机器学习常识 21: 卷积神经网络

摘要: 卷积操作保留体现了空间相关性. 1. 卷积操作 图 1. 卷积操作 Valid 方式. 图 1 下平面标定的 3 3 3 \times 3 33 区域, 对应于个 3 3 3 \times 3 33 卷积, 这 9 9 9 个数对应着相乘, 然后相加, 获得了上平面标定的 1 1 1 个小区域的值. 注意这里不是矩阵的乘法. 卷…

《大数据技术与应用》课程实验报告|week12|实验8|Pig——高级编程环境 验证评估函数

目录 一、实验内容 二、实验目的 三、实验设备 四、实验步骤 步骤一 步骤二 步骤三 步骤四 步骤五 步骤六 步骤七 步骤八 步骤九 步骤十 步骤十一 步骤十二 步骤十三 步骤十四 步骤十五 步骤十六 五、实验结果 六、实验小结 一、实验内容 验证19.5节中的…