Mysql数据存储格式分析

news2024/7/6 18:44:24

一、整体存储逻辑

1.1 Mysql数据存放位置

不同的存储引擎,对Mysql数据的存储是不同的。新建一个test数据库,里面有t1,t2和test5三张表,以Innodb和Myisam存储引擎为例:
在这里插入图片描述
Innodb存储引擎:

.frm文件:与表相关的元数据信息都存放在frm文件中,包括表结构的定义信息。
.ibd文件或.ibdata文件:都是存放InnoDB数据的文件【数据和索引】。
【独享表空间存储方式】使用.ibd文件,并且每一个表一个.ibd文件;
【共享表空间存储方式】使用.ibdata文件,所有表共同使用一个.ibdata文件
独享和共享由innodb_file_per_table字段控制,从5.6版本后,默认为1,即使用独享表的方式

在这里插入图片描述
MyISAM存储引擎:

.frm文件:与表相关的元数据信息都存放在frm文件中,包括表结构的定义信息
MVD(MYData)文件:用于存储MyISAM表的数据
MYI(MYIndex)文件:用于存储MyISAM表的索引相关信息

二、详细存储格式分析

考虑到工作中使用Innodb存储引擎居多,后面讨论以Innodb存储引擎为主。ibd文件又称表空间文件,从逻辑和物理上进行了层次性的划分。主要分为:段Segment,区Extent,页Page以及行Row
表结构
下面对每个结构类型进行介绍:

行Row:表示一条记录,是存储的最小单元;
页Page: 考虑到每次读取一个条记录,需要进行一次IO,效率非常低,因此Innodb是按照为单位进行读取的。默认页的大小为16KB,为了提高读取效率,页中的行记录是连续存储,可以方便顺序IO
区Extent: Innodb存储引擎采用的是B+树来存储的。B+ 树中每一层都是通过双向链表连接起来的,如果是以页为单位来分配存储空间,那么链表中相邻的两个页之间的物理位置并不是连续的,可能离得非常远,那么磁盘查询时就会有大量的随机I/O,随机 I/O 是非常慢的。因此,最好的解决办法就是让链表中相邻的页的物理位置也相邻,这样就可以使用顺序 I/O 了,那么在范围查询(扫描叶子节点)的时候性能就会很高。解决方案:在表中数据量大的时候,为某个索引分配空间的时候就不再按照页为单位分配了,而是按照区(extent)为单位分配。每个区的大小为1MB,对于 16KB 的页来说,连续的 64 个页会被划为一个区,这样就使得链表中相邻的页的物理位置也相邻,就能使用顺序 I/O 了。
段Segment:段是由多个区组成的,两个区之间是逻辑上相邻的,物理上不一定相邻。段分为:数据段,索引段和回滚段

  1. 数据段:存放B+树叶子节点的区集合;
  2. 索引段:存放B+树的非叶子节点的区集合;
  3. 回滚段:存放的是回滚数据的区集合。后续用于MVCC版本控制。

2.1 存储格式分类

系统是不断演进的,因此Mysql的存储格式也在不断优化。主要有以下几种存储格式:

COMPACT行格式:是其它几种格式的基础。处理行溢出时,一部分数据存储在当前页中,多余的部分存储在其它页中,然后记录其它页的内存地址
Redundant行格式:已经不再使用。
Dynamic行格式:目前Mysql5默认使用的方式。基本上和Compact一样,只不过在处理行溢出时,Danamic行格式,直接将数据存储在其他页面,然后指向该页面的内存地址
Compressed行格式:采用压缩算法对页面进行压缩。

2.2 存储格式详解

下面分析的行记录存储格式,是Mysql 的COMPACT格式,Dynamic和Compressed都是一样的。
行记录的整体组成部分

2.2.1 额外信息

变成字段长度列表

变长字符有哪些:varchar,test,blob
是否必需:不一定。若表中没有变长字段,则不会有
【变长字段】占用内存大小:例如varchar(M), 在utf-8编码情况下,每个字符占用N个字节,则占用内存大小为:(M*N)个字节。具体情况要看编码格式,以及编码格式下的每个字符占用情况。
存储【变长字符长度】占用的内存大小为: 
	1.M*N <=255,则占用1字节;
	2.M*N > 255,则需要区分字符串实际占用的大小L
		2.1L <= 127, 则使用1个字节来表示;
		2.2L > 127, 则使用2个字节来表示.
【注意】:
	1. 不会超过2个字节,因为一条记录的最多占用内存65535个字节
	2. 若一行记录中,有多个变长字段,那每个变长字段的长度,按照逆序存放
	3. 若没有变长字段,则不会有这个变长字段长度列表存在

NULL值列表

Mysql会将字段为null的,进行压缩处理,即若多个字段都为null,为了节省内存空间,会将每个允许存储null的列,对应一个二进制位,按照【逆序】存放。其中1表示该列的值为null0表示不为null。例如:有三个字段可以为null,a,b,c,则存储形式为:
	  c         b           a
00000 0         0           0
因mysql要求,存储null值列表必须为整数个字节,因此,不足8的倍数的情况,前面自动补0,同时每8位表示一个字节
注意:
	1. 因已经表示了是否存储为null,则在真实数据部分,若字段为null,则不会存储

记录头信息
主要用于描述记录的头信息,由固定的5个字节组成。

名称大小(单位:bit)描述
预留位11没有使用
预留位21没有使用
delete_mask1标记该记录是否被删除
min_rec_mask1B+树的每层非叶子节点中的最小记录都会添加该标记
n_owned4表示当前记录拥有的记录数
heap_no13表示当前记录在记录堆的位置信息
record_type3表示当前记录的类型,0表示普通记录,1表示B+树非叶子节点记录,2表示最小记录,3表示最大记录
next_record16表示下一条记录的相对位置

2.2.2 真实数据

隐藏字段

Mysql会为每条记录,添加一下隐藏列。例如:
	- db row_id: 不是必须的。占用6个字节,行ID,唯一标识一条记录。详见下面的主键生成策略:
	- db transction_id: 必须的。占用6个字节,事务ID
	- db roll pointer: 必须的。占用7个字节,回滚指针

【主键生成策略】:
1. 优先使用用户自定义主键
2. 若没有,则选取一个唯一非空字段作为主键
3. 若唯一非空字段也没有,则默认添加一个row_id作为主键

真实数据:
就是业务方自己存储的字段值信息。

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

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

相关文章

如何查看MySQL binlog日志

1、查看MySQL是否开启binlog日志 SQL&#xff1a;show variables like ‘%log_bin%’; log_bin:on 是开启状态 若是OFF&#xff0c;则需要开启binlog日志。 开启方式&#xff1a;打开mysql配置文件my.cnf&#xff0c;在[mysqlId]下面增加 log-binmysql-bin 查看binlog日志 …

【客户案例】禅道软件助力长虹新网实现研发项目管理创新

四川长虹新网科技有限责任公司&#xff08;以下简称长虹新网&#xff09;深耕全球运营商市场二十多年&#xff0c;具备行业领先的软硬件研发、制造、全球化市场营销能力&#xff0c;持续服务国内外200多家主流电信及广电运营商、垂直行业服务商&#xff0c;与合作伙伴共同成长。…

快团团怎么做帮卖团长/供货大团长(如何从小白到优质团长)?

一名小白想要成长为快团团的优质团长&#xff0c;可以遵循以下步骤和策略&#xff1a; 了解平台与注册成为团长&#xff1a; 首先&#xff0c;熟悉快团团平台的操作流程和规则。快团团是一个基于微信的小程序&#xff0c;专注于社区团购业务。通过微信扫描团长资源二维码或在快…

NodeJS编写后端接口

技术栈 1.express&#xff1a;Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建 各种 Web 应用&#xff0c;和丰富的 HTTP 工具&#xff0c;使用 Express 可以快速地搭建一个完整功能的网站。 2.mysql&#xff1a;用于操作MySQL数据库 3.bod…

pytorch常用内置loss函数与正则化技术(补充小细节)

文章目录 前言一、常用损失函数(后面用到了新的会一一补充)1.1 回归中的损失函数1.1.1 nn.MSELoss()示例1:向量-向量示例2:矩阵--矩阵(维度必须一致才行)1.2 分类中的损失函数1.2.1 二分类(1)nn.BCELoss --- 二分类交叉熵损失函数示例1:向量-向量示例2:矩阵--矩阵(维…

618买什么划算?618买啥好?618数码好物推荐,必买清单大放送!

随着一年一度的618购物狂欢节的临近&#xff0c;作为数码领域的资深爱好者&#xff0c;我感到有责任为大家推荐精心挑选的数码精品。无论你是追逐科技尖端的探索者&#xff0c;还是希望通过智能装备提升生活品质的时尚人士&#xff0c;这里的每一款产品都能与你的心灵产生共鸣。…

基于PHP开发的图片高清无损在线压缩源码系统 带完整源代码以及搭建教程

系统概述 高清无损在线压缩源码系统基于PHP语言开发&#xff0c;结合GD库和ImageMagick等图像处理工具&#xff0c;实现了对JPEG、PNG、GIF等多种图片格式的高清无损压缩。系统采用B/S架构&#xff0c;用户只需通过浏览器访问系统界面&#xff0c;即可实现图片的上传、压缩、预…

【小白入门篇6】常识|怎么计算模型需要的资源

01 背景 各个公司相继推出大模型, 有开源和不开源,有些技术爱好者也开始心痒难耐&#xff0c;萌生了私有本地模型,甚至有伙伴构建大模型并进行训练的想法, 大模型不仅比拼技术, 也是比拼爹(资源)的存在, 我个人在实战经历经常问自己,到底需要什么样配置才能跑起来这个模型, 完…

玩转cpp小项目星球3周年了!

公众号原创文章破600&#xff01;玩转cpp小项目星球目前已运营3年&#xff0c;平时不怎么宣传&#xff0c;借此机会给大家分享一下这三年里面我沉淀了哪些内容。里面包含&#xff1a; 1.小项目&#xff1a;一些核心模块的拆解&#xff0c;例如&#xff1a;grpc、mutex、线程池等…

python数据分析——数据分类汇总与统计

数据分类汇总与统计 前言一、Groupby分类统计语法按列分组示例一示例二示例三 遍历各分组示例 使用字典和Series分组示例 使用函数分组示例 二、数据聚合groupby的聚合函数示例一示例二 逐列及多函数应用示例一示例二 返回不含行索引的聚合数据示例 三、一般性的“拆分-应用-合…

程序员日志之星际争霸

目录 传送门正文日志1、概要2、星际争霸编年史2.1、最早版本 Alpha2.2、早期版本 Early Beta2.3、测试版 Beta2.4、正式版 StarCraft2.5、母巢之战测试版 BroodWar Beta2.6、星际争霸-母巢之战 BroodWar2.7、地图编辑器&#xff08;1.07及以上&#xff09; StarEdit2.8、《星际…

掌握决策之道:层次分析法(AHP)的步骤、应用与局限性

目录 一、层次分析法简介 举一个小例子&#xff1a; 评价类问题可用打分解决&#xff0c;比如&#xff1a;小华高考结束后&#xff0c;在华科和武大两所学校之间做抉择。 评价类问题可用打分解决 二、层次分析法的步骤 &#xff08;一&#xff09;一道引出层次分析法的例…

造纸废水处理有哪些工艺设备

造纸废水处理是一个复杂的过程&#xff0c;因为造纸过程中产生的废水含有大量的有机物、悬浮物、色素、油脂、木质素、纤维素等污染物。为了有效处理这些废水&#xff0c;通常需要采用一系列的工艺设备。以下是一些常见的造纸废水处理工艺设备&#xff1a; 格栅&#xff1a;用于…

申贷时,银行级大数据自己能查到吗?

随着金融风控的不断健全&#xff0c;大数据作为辅助的风控工具正在被越来越多的银行和机构使用。在进行申贷时&#xff0c;银行通常会进行大数据查询&#xff0c;以便评估申请人的信用状况。那么&#xff0c;这些大数据自己能查到吗?接下来本文就为大家详细介绍一下&#xff0…

OKHTTP 3.12.0 以后版本 headers 中不可携带中文

今天遇到的报错&#xff1a; java.lang.llegalArgumentException: Unexpected char 0x957f at 0 in x-brand value: 电视堆栈 okhttp3.Headers.checkValue(Headers.java:272) okhttp3.Headers$Builder.add(Headers.java:312) okhttp3.Request$Builder.addHeader(Request.iava:…

超便捷备忘录共享方法 文字文件都可共享

在这个信息爆炸的时代&#xff0c;备忘录已成为我们生活中不可或缺的小助手。它记录着我们的工作计划、待办事项、灵感闪现&#xff0c;甚至是那些温馨的家庭琐事。然而&#xff0c;当我们在不同的设备间穿梭&#xff0c;如何在手机、电脑&#xff0c;甚至是不同品牌的手机之间…

selenium进行xhs图片爬虫:05xhs一个博主的全部文章链接获取

在今天的文章中&#xff0c;是需要进行保持登录状态的&#xff0c;如果没有登录状态。会导致xhs博主下的文章数量缺失。 我使用的仍然是selenium远程调试&#xff0c;也就是我之前说的selenium操作已经打开的浏览器。这块内容配置还是挺简单的&#xff0c;大家可以去试试。 今…

vuerouter声明式导航

声明式导航-跳转传参数 1.查询参数传参 语法&#xff1a;to /path?参数名值 2.对应页面组件接受传来的值 $router.query.参数名 2.动态路由传参 1.配置动态路由 2.配置导航连接 to/path/参数值 3.对应页面组件接收传递过来的值 #route.params.参数名 多个参数传递&…

GPT搜索引擎原型曝光!

OpenAI发布会前一天&#xff0c;员工集体发疯中……上演大型套娃行为艺术。 A&#xff1a;我为B的兴奋感到兴奋&#xff1b;B&#xff1a;我为C的兴奋感到兴奋……Z&#xff1a;我为这些升级感到兴奋 与此同时还有小动作不断&#xff0c;比如现在GPT-4的文字描述已不再是“最先…

树莓派|SPI通信

SPI的原理 SPI&#xff08;Serial Peripheral Interface&#xff09;是一种同步的串行通信协议&#xff0c;它允许在单片机和外设之间高速地传输数据。SPI协议主要有以下特点&#xff1a; 采用全双工通信模式&#xff0c;同时支持主从模式&#xff08;Master/Slave&#xff09…