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

文章目录

    • 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IDEA 出现问题:git提交commit时Perform code analysis卡住解决方案

问题 git提交commit时Perform code analysis卡住很久 解决方案一 1、打开 IntelliJ IDEA&#xff0c;进入 File -> Settings&#xff08;或者使用快捷键 CtrlAltS&#xff09;。 2、在弹出的 Settings 窗口中&#xff0c;找到 Version Control -> Commit Dialog 选项…

Flink 有状态流式处理

传统批次处理方法 【1】持续收取数据&#xff08;kafka等&#xff09;&#xff0c;以window时间作为划分&#xff0c;划分一个一个的批次档案&#xff08;按照时间或者大小等&#xff09;&#xff1b; 【2】周期性执行批次运算&#xff08;Spark/Stom等&#xff09;&#xff1b…

机器学习---Adaboost算法

1. Adaboost算法介绍 Adaboost是一种迭代算法&#xff0c;其核心思想是针对同一个训练集训练不同的分类器&#xff08;弱分类器&#xff09;&#xff0c;然 后把这些弱分类器集合起来&#xff0c;构成一个更强的最终分类器&#xff08;强分类器&#xff09;。Adaboost算法本身…

CSS学习

CSS学习 1. 什么是css?2.css引入方式2.1 内嵌式2.2 外联式2.3 行内式2.4 引入方式特点 3. 基础选择器3.1 标签选择器3.2 类选择器3.3 id选择器3.4 通配符选择器 1. 什么是css? 2.css引入方式 2.1 内嵌式 2.2 外联式 提示: 需要在html文件中link目标样式表; 2.3 行内式 注意:…

【EventBus】EventBus源码浅析

二、EventBus源码解析 目录 1、EventBus的构造方法2、订阅者注册 2.1 订阅者方法的查找过程2.2 订阅者的注册过程1. subscriptionsByEventType 映射&#xff1a;2. typesBySubscriber 映射&#xff1a;2.3 总结订阅者的注册过程 3、事件的发送 3.1 使用Post提交事件3.2 使用p…

【STM32】DMA直接存储器存取

1 DMA简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 可以直接访问STM32的存储器的&#xff0c;包括运行SRAM、程序存储器Flash和寄存器等等 DMA可以提供外设寄存器和存储器或者存储器和存储器之间的高速数据传输&#xff0c;无须CPU干预&#xff0c;节…

【lombok】从easyExcel read不到值到cglib @Accessors(chain = true)隐藏的大坑

背景: 在一次使用easyExcel.read 读取excel时&#xff0c;发现实体类字段没有值&#xff0c;在反复测试后&#xff0c;发现去掉Accessors(chain true)就正常了&#xff0c;为了验证原因&#xff0c;进行了一次代码跟踪 由于调用链路特别长&#xff0c;只列举出部分代码&#x…

二蛋赠书十一期:《TypeScript入门与区块链项目实战》

前言 大家好&#xff01;我是二蛋&#xff0c;一个热爱技术、乐于分享的工程师。在过去的几年里&#xff0c;我一直通过各种渠道与大家分享技术知识和经验。我深知&#xff0c;每一位技术人员都对自己的技能提升和职业发展有着热切的期待。因此&#xff0c;我非常感激大家一直…

【C 剑指offer】有序整型矩阵元素查找 {杨氏矩阵}

目录 题目内容&#xff1a; 思路&#xff1a; 图形演示&#xff1a; 复杂度分析 C源码&#xff1a; /** *************************************************************************** ******************** ********************* ******…

DWA(dynamic window approach)算法学习

系列文章目录 A*算法学习-CSDN博客 弗洛伊德算法&#xff08;Floyd&#xff09;和路径平滑弗洛伊德算法&#xff08;Smooth Floyd&#xff09;学习-CSDN博客 D*算法学习-CSDN博客 目录 系列文章目录 前言 搜索空间 —减小速度搜索空间 优化过程 —最大化目标函数 算法实…

《洛谷深入浅出》斯特林数

斯特林数被分为三种&#xff0c;但我们这只介绍两种。即第一类斯特林数&#xff0c;和第二类斯特拉数。 第一类斯特林数指的是&#xff1a; 将n个不同元素&#xff0c;变成m个圆排列的方案数量。第一类斯特林数&#xff0c;分为有符号和无符号。通常我们只研究无符号斯特林数&…

Layui深入

1、代码&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>注册页面</title> <style> .container { max-width: 600px; margin: 0 auto; padding: 20px; …

Proxmox VE 安装 OpenWrt 配置旁路由教程

话不多说&#xff0c;本篇文章将记录如何在 Proxmox VE 环境通过虚拟机安装 OpenWrt 配置旁路由的过程&#xff0c;仅做参考。 PVE 创建虚拟机 名称随意&#xff0c;GuestOS 选择 Linux&#xff0c;不使用任何 iso 镜像。&#xff08;记住你的 VMID&#xff09; 清空将要创建…

超越边界:Mistral 7B挑战AI新标准,全面超越Llama 2 13B

引言 在人工智能领域&#xff0c;模型的性能一直是衡量其价值和应用潜力的关键指标。近日&#xff0c;一个新的里程碑被设立&#xff1a;Mistral AI发布了其最新模型Mistral 7B&#xff0c;它在众多基准测试中全面超越了Llama 2 13B模型&#xff0c;标志着AI技术的一个重大进步…

python实现形态学建筑物指数MBI提取建筑物及数据获取

前言 形态学建筑物指数MBI通过建立建筑物的隐式特征和形态学算子之间的关系进行建筑物的提取[1]。 原理 上图源自[2]。 实验数据 简单找了一张小图片&#xff1a; test.jpg 代码 为了支持遥感图像&#xff0c;读写数据函数都是利用GDAL写的。 import numpy as np import …

静态路由的原理和配置

一.路由器的工作原理 首先我们知道路由器是工作在网络层的&#xff0c;那就是三层设备。网络层的功能主要为&#xff1a;不同网段之间通信、最佳路径选择也就是逻辑地址&#xff08;ip地址&#xff09;寻址、转发数据。 1.路由器是什么 路由器是能将数据包转发到正确的目的地…

【MySQL】MySQL数据库基础--什么是数据库/基本使用/MySQL架构/存储引擎

文章目录 1.什么是数据库2.主流数据库3.基本使用3.1MySQL安装3.2连接服务器3.3服务器管理3.4服务器&#xff0c;数据库&#xff0c;表关系3.5使用案例3.6数据逻辑存储 4.MySQL架构5.SQL分类6.存储引擎6.1什么是存储引擎6.2查看存储引擎6.3存储引擎对比 1.什么是数据库 对于回答…

【vue实战项目】通用管理系统:信息列表,信息的编辑和删除

本文为博主的vue实战小项目系列中的第七篇&#xff0c;很适合后端或者才入门的小伙伴看&#xff0c;一个前端项目从0到1的保姆级教学。前面的内容&#xff1a; 【vue实战项目】通用管理系统&#xff1a;登录页-CSDN博客 【vue实战项目】通用管理系统&#xff1a;封装token操作…

Spring Boot 3 整合 Mybatis-Plus 动态数据源实现多数据源切换

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

Docker容器:Centos7搭建Docker镜像私服harbor

目录 1、安装docker 1.1、前置条件 1.2、查看当前操作系统的内核版本 1.3、卸载旧版本(可选) 1.4、安装需要的软件包 1.5、设置yum安装源 1.6、查看docker可用版本 1.7、安装docker 1.8、开启docker服务 1.9、安装阿里云镜像加速器 1.10、设置docker开机自启 2、安…