MySQL一行记录是怎么存储的?

news2024/12/27 11:35:50

文章目录

    • MySQL 一行记录是怎么存储的?
        • MySQL 的数据存放在哪个文件?
          • 表空间文件结构
        • InnoDB行格式有哪些
        • Compact行格式
        • varchar(n) 中 n 最大取值为多少?
        • 行溢出后,MySQL是怎么处理的?

MySQL 一行记录是怎么存储的?

1. MySQL 的 NULL 值会占用空间吗?
        Compact行格式中用NULL值列表标记值为NULL的列,不会存储在真实数据,NULL值列表至少占用1字节的空间,当表中所有字段为NOT NULL,不会有NULL值列表,节省1字节的空间
2. MySQL 怎么知道 varchar(n) 实际占用数据的大小?
        Compact行格式用 变长字段长度列表 存储变长字段实际占用数据的大小
3. varchar(n) 中 n 最大取值为多少?
        一行记录最大存储65535字节数据,包括了变长字段长度列表所占用的字节数和NULL值列表所占用的字节数和真实数据占用的字节数
        如果一张表只有一个 varchar(n) 字段,且允许为 NULL,字符集为 ascii。varchar(n) 中 n 最大取值为 65532。(65535-2-1)
        如果有多个字段,保证所有字段的长度+.+. <= 65535
4. 行溢出后,MySQL 是怎么处理的?
        一个数据页存不了一条记录,将溢出的数据存放到溢出页
        Compact:
            记录的真实数据处存放该列的一部分数据,剩余数据放在溢出页,真实数据处用20字节存储指向溢出页的地址
        Compressed Dynamic:
            记录的真实数据处不存放该列的数据,只存储20字节的指针指向溢出页,实际数据都存储在溢出页
MySQL 的数据存放在哪个文件?
表名字.ibd文件里,这个文件也被称为独占表空间文件

mysql的数据保存在磁盘的哪个文件?不同存储引擎保存的文件不同。

以InnoDB(默认引擎)为例讨论

每创建一个数据库,都会在/var/lib/mysql/ 目录下创建一个以数据库名为名的目录,保存表结构和表数据文件都在这个目录里

数据库名:my_test
表名:t_order

[root@xiaolin ~]#ls /var/lib/mysql/my_test
db.opt           // 存储当前数据库的默认字符集和字符校验规则
t_order.frm       // t_order的表结构
t_order.ibd        // t_order的表数据
表空间文件结构

段、区、页、行组成

img

1. 行
    数据库表中的记录按行存放
2. 页
    InnoDB的数据按页为单位读取,当需要读一条记录时,以页为单位,将其整体读入内存
    默认每页16KB
    表中的记录存储在[数据页]里
3. 区
    B+树每层通过双向链表连接,若以页为单位分配存储空间,链表相邻的页的物理位置不是连续的,磁盘查询时有大量的随机I/O,非常慢
        解决:链表中相邻的页物理位置上页相邻
             按照区为单位进行分配存储空间,每个区大小为1MB,连续的64页被分为一个区,可以使用顺序I/O
4. 段
    索引段:存放B+树的非叶子节点的区的集合
    数据段:存放B+树的叶子节点的区的的集合
    回滚段:回滚数据的区的集合(事务隔离)
InnoDB行格式有哪些

行格式:一条记录的存储结构

Redundant、Compact、Dynamic、Compressed

Compact行格式

img

  • 记录的额外信息

    • 变长字段长度列表

      varchar 变长:实际存储的数据的长度不固定
      在存储的数据时,把数据占用的大小存起来,存到[变长字段长度列表]里,读取数据的时候根据[变长字段长度列表]读取对应长度的数据
      
      变长字段长度列表的信息按照列的顺序 逆序 存放
      

      imgimg

      为什么变长字段长度列表的信息按照逆序存放?

      使得位置靠前的记录的真实数据和数据对应的字段长度信息可以同时在一个 CPU Cache Line 中,这样就可以提高 CPU Cache 的命中率

      NULL值列表的信息也需要逆序存放

      当数据表没有变长字段时,行格式不会有变长字段长度列表

    • NULL值列表

      值为NULL的列存储到NULL值列表

      二进制位为1:该列值为NULL
      二进制位为0:该列值不为NULL
      

      img

      1. 第一条记录  000     = 00
      2. 第二条记录  100     = 04
      3. 第三条记录  110     = 06
      (不足八位高位补0)
      

      当数据表的字段都定义成NOT NULL时,行格式不会有NULL值列表(至少占用1字节空间)

      (若一条记录有9条字段值都是NULL,会创建2字节…)

    • 记录头信息

      1. delete_mask:
              标识此条数据是否被删除,执行delete时不会真正删除记录。
      2. next_record:
              下一条记录的位置。指向下一条记录的记录头信息和真实数据之间的位置,向左读时记录头信息,向右读是真实数据
      3. record_type:
              表示当前记录的类型。
      
  • 记录的真实数据

    • row_id
      • 建表时指定了主键/唯一约束列,就没有row_id。(非必需)
    • trx_id
      • 事务id,表示这个数据是由哪个事务生成(必需)
    • roll_pointer
      • 这条记录上一个版本的指针(版本)

    MVCC

varchar(n) 中 n 最大取值为多少?

一行记录除了 TEXT、BLOBs 类型的列,限制最大为 65535 字节,注意是一行的总长度,不是一列。

varchar(n) n代表最多存储的字符数量(注意是字符数量)
  • 单字段情况

    • 只定义一个字段,varchar(n)

      • 计算n时,需要65535减去变长字段长度列表和NULL值列表占用的字节数

      • 分为三个部分存储:

        • 真实数据
        • 真实数据占用的字节数
        • NULL标识,如果不允许为NULL,不需要这部分
      • 举例:

        CREATE TABLE test ( 
        `name` VARCHAR(65535)  NULL
        ) ENGINE = InnoDB DEFAULT CHARACTER SET = ascii ROW_FORMAT = COMPACT;
        报错
        

        NULL值列表所占用的字节数?

        1字节

        变长字段长度列表所占用的字节数?

        = 所有变长字段长度占用的字节数之和

        每个变长字段的 变长字段长度 需要用多少字节表示?

        1. 如果变长字段允许存储的最大字节数<= 255,1字节表示
        2. 如果>=255,2字节表示

        这里为65535,字符集assci,代表允许存储的最大字节数为65535,2字节表示

        65535-2-1 = 65532

        若采用utf-8,一个字符最多需要三个字节,n=65532/3

  • 多字段情况

    • 所有字段的长度+变长字段字节数列表所占用的字节数+NULL值列表所占用的字节数 <= 65535
行溢出后,MySQL是怎么处理的?

mysql中磁盘和内存交互的单位是页,页一般为16kb,而一个varchar(n)类型的列最多存储65532字节,一些大对象TEXT、BLOB可能存储更多的数据,一个页可能存不了一条记录,发生行溢出,多的数据就会存到另外的溢出页

Compact行格式的行溢出的处理:

img

Compressed 和 Dynamic 的行溢出的处理:
img

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

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

相关文章

SpringBoot 这么实现动态数据源切换,就很丝滑!

最近在做业务需求时&#xff0c;需要从不同的数据库中获取数据然后写入到当前数据库中&#xff0c;因此涉及到切换数据源问题。本来想着使用Mybatis-plus中提供的动态数据源SpringBoot的starter&#xff1a;dynamic-datasource-spring-boot-starter来实现。 结果引入后发现由于…

【QT 5 调试软件+Linux下调用脚本shell-经验总结+初步调试+基础样例】

【QT 5 调试软件Linux下调用脚本shell-经验总结初步调试基础样例】 1、前言2、实验环境3、自我总结4、实验过程&#xff08;1&#xff09;准备工作-脚本1&#xff09;、准备工作-编写运行脚本文件2&#xff09;、给权限3&#xff09;、运行脚本 &#xff08;2&#xff09;进入q…

亚马逊测评如何安全有效地进行?完整攻略解读

亚马逊测评一直是许多亚马逊卖家快速了解市场、获得评论和提高销售的方法之一。与此同时&#xff0c;亚马逊官方对测评的控制也越来越严格。测评越来越困难&#xff0c;如果操作不当&#xff0c;可能会导致账户被禁等严重后果。 因此&#xff0c;如何安全有效地测评亚马逊已经成…

防职业掉坑必看,电商设计主要做什么?

今年双十一刚结束&#xff0c;各电商平台不公布总销售额的新闻就上了热搜。外行人乍一看可能觉得消费意愿下降&#xff0c;消费水平降级&#xff0c;电商行业不景气&#xff0c;但实际上电商领域在国内突飞猛进了10几年后&#xff0c;仍然还有很大的上升空间。很多人说&#xf…

解决高风险代码(含前后端):Insecure Randomness

Abstract 标准的伪随机数值生成器不能抵挡各种加密攻击 Explanation 在对安全性要求较高的环境中&#xff0c;使用能够生成可预测值的函数作为随机数据源&#xff0c;会产生 Insecure Randomness 错误。 电脑是一种具有确定性的机器&#xff0c;因此不可能产生真正的随机性。伪…

招不到人?用C语言采集系统批量采集简历

虽说现在大环境不太好&#xff0c;很多人面临着失业再就业风险&#xff0c;包括企业则面临着招人人&#xff0c;找对口专业难得问题。想要找到适合自己公司的人员&#xff0c;还要得通过爬虫获取筛选简历才能从茫茫人海中找到公司得力干将。废话不多说&#xff0c;直接开整。 1…

汽车底盘市场分析:预计到2025年平均渗透率达到35%

汽车底盘由传动系、行驶系、转向系和制动系四部分组成。底盘作用是支承、安装汽车发动机及其各部件、总成&#xff0c;形成汽车的整体造型&#xff0c;并接受发动机的动力&#xff0c;使汽车产生运动&#xff0c;保证正常行驶。汽车底盘容易产生故障的部位主要集中在&#xff1…

如何本地搭建WampServer并结合cpolar内网穿透实现远程访问

文章目录 前言1.WampServer下载安装2.WampServer启动3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 Wamp 是一个 Windows系统下的 Apache PHP Mysql 集成安装环境&#xff0c;是一组常用来…

聚观早报 |小鹏P7i推出限时福利;荣耀90 GT外观曝光

【聚观365】12月13日消息 小鹏P7i推出限时福利 荣耀90 GT外观曝光 小米14 Ultra春节后登场 苹果新一代iPad Air将搭载M2芯片 Rambus发布内存控制器IP 小鹏P7i推出限时福利 小鹏汽车将旗下智驾主力车型P7i全系车型开启限时购车优惠政策&#xff0c;用户下定小鹏P7i即可享受…

医保电子凭证在项目中的集成应用

随着医保电子凭证使用普及&#xff0c;医疗行业的各个场景都要求支持医保码一码通办&#xff0c;在此分享一下&#xff0c;在C#和js中集成医保电子凭证的demo 供有需要的小伙伴参考。 一、项目效果图 在c#中集成医保电子凭证效果 在js中集成医保电子凭证效果 二、主要代码 c#…

【干货分享】KingIOServer与三菱PLC的通讯的应用案例

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 最近一个项目涉及用KingIOServer采集三菱PLC数据&#xff0c;特记录通讯过程方便备忘。 一、版本说明&#xff1a; 1、KingIOServer版本&#xff1a;3.7SP2 2、PLC型号&#xff1a;Q03UDV 和Q03UDE自带以太网网口。…

阿里云国际跨境直播解决方案,视频AI创新营销模式丰富直播场景

据第三方咨询公司iiMedia Research预测&#xff0c;2017-2020年&#xff0c;视频直播行业一直处于高速发展阶段。2020年&#xff0c;视频直播行业市场收入超1万亿元&#xff0c;累计覆盖用户5.26亿。 视频直播的应用范围已从视频娱乐、电子商务等泛互联网行业扩展到在线教育、…

docker安装rabbitmq并安装死信队列插件

环境 debian11 docker 20.10.22 rabbitmq 3.10.0 拉取镜像到本地 docker pull rabbitmq3.10.0 实例化 docker run -d --name rabbit -e RABBITMQ_DEFAULT_USERadmin -e RABBITMQ_DEFAULT_PASSadmin -p 15672:15672 -p 5672:5672 -p 25672:25672 -p 61613:61613 -p 1883:…

如何利用淘宝商品详情关键词搜索电商API接口,实现个人收藏的梦想?

随着互联网的快速发展&#xff0c;电子商务市场越来越繁荣&#xff0c;个人收藏爱好者面临着越来越多的商品选择。如何能够高效地找到自己心仪的商品成为了让这一群体头疼的问题。而淘宝商品详情关键词搜索电商API接口的出现&#xff0c;联讯数据为个人实现收藏梦想提供了全新的…

ISP去噪(1)

#灵感# 因为理解的2DNR、3DNR 和当前调试平台标注的2DNR、3DNR 作用有很大差异&#xff0c;所以在网上广撒网&#xff0c;搜集知识。 目前收集出来一个这样的文章&#xff0c;有点像大学生的论文“取其精华&#xff0c;合成糟粕”。------权当一个记录册 目录 运动阈值&…

创建第一个Vue2项目-----HelloWorld

创建第一个Vue项目 第一步先去安装Vue&#xff0c;一共有两种安装方式&#xff0c;这里使用 点击这里下载&#xff1a;Vue.js 添加到自己的项目中 在使用的页面引入<script src"../js/vue.js"></script> 2. 准备好一个容器 <div id"root&qu…

迪拜义乌中国小商品城,开启中东区域展贸新商机

迪拜义乌中国小商品城&#xff0c;一颗璀璨的批发市场新星&#xff0c;正在迪拜杰贝阿里自贸区内冉冉升起。      在全球格局巨变的背景下&#xff0c;阿联酋与欧美货币深度绑定&#xff0c;同时又积极加入金砖国家集团&#xff0c;与发展中国家的经济不断融合。而作为国际…

微信小程序---wxs脚本

WXS&#xff08;WeiXin Script&#xff09;是小程序的一套脚本语言&#xff0c;结合 WXML&#xff0c;可以构建出页面的结构。 WXS 与 JavaScript 是不同的语言&#xff0c;有自己的语法&#xff0c;并不和 JavaScript 一致。 1.wxs和JavaScript的区别 2.wxs脚本基础语法 &a…

uniapp+vite+ts+express踩坑总结

1 关于引入express包报 import express from "express"; ^^^^^^ SyntaxError: Cannot use import statement outside a module的问题。 解决方案&#xff1a; 在package.json中添加type&#xff1a;“module”选项 2 Response is a type and must be imported …