首页 > 数据库 >MySQL提升笔记(4)InnoDB存储结构(1)

MySQL提升笔记(4)InnoDB存储结构(1)

时间:2024-04-01 22:59:10浏览次数:29  
标签:存储 字节 记录 笔记 InnoDB MySQL NULL 数据

innoDB存储引擎中,常见的页类型有:

✅ 数据页(B-tree Node)

✅ undo页(undo Log Page)

✅ 系统页 (System Page)

✅ 事务数据页 (Transaction System Page)

✅ 插入缓冲位图页(Insert Buffer Bitmap)

✅ 插入缓冲空闲列表页(Insert Buffer Free List)

✅ 未压缩的二进制大对象页(Uncompressed BLOB Page)

✅ 压缩的二进制大对象页 (compressed BLOB Page)

1.5、行(row)


InnoDB存储引擎是面向行的(row-oriented),也就是说数据是按行进行存放的,每个页存放的行记录也是有硬性定义的,最多允许存放16KB/2-200,即7992行记录。

2、InnoDB 行记录格式

====================================================================================

InnoDB 存储引擎和大多数数据库一样(如 OracleMicrosoft SQL Server 数据库),记录是以行的形式存储的。这意味着页中保存着表中一行行的数据。在 InnoDB 1.0x 版本之前,InnoDB 存储引擎提供了 CompactRedundant 两种格式来存放行记录数据,这也是目前使用最多的一种格式。

2.1、Compact 行记录格式


Compact 行记录是在 MySQL 5.0 中引人的,其设计目标是髙效地存储数据。简单来说,一个页中存放的行数据越多,其性能就越髙。

下图显示了 Compact 行记录的存储方式:

**Compact** 行记录

Compact 行记录格式的首部是一个非 NULL 变长字段长度列表,并且其是按照列的顺序逆序放置的,其长度为:

  • 若列的长度小于 255 字节,用 1 字节表示;

  • 若大于 255 个字节,用2 字节表示。

变长字段的长度最大不可以超过 2 字节,这是因在 MySQL 数据库中 VARCHAR 类型的最大长度限制为 65535。变长字段之后的第二个部分是 NULL 标志位,该位指示了该行数据中是否有 NULL 值,有则用 1 表示。

接下来的部分是记录头信息(record header),固定占用5 字节(40 位)。每位含义见表:

| 名称 | 大小(bit) | 描述 |

| — | — | — |

| () | 1 | 未知 |

| () | 1 | 未知 |

| deleted_flag | 1 | 该行是否已被删除 |

| min_rec_flag | 1 | 如果该行记录是预定义为最小的记录,为1 |

| n_owned | 4 | 该记录拥有的记录数,用于Slot |

| heap_no | 13 | 索引堆中该条记录的索引号 |

| record_type | 3 | 记录类型,000(普通),001(B+Tree节点指针),010(Infimum),011(Supremum) |

| next_record | 16 | 页中下一条记录的相对位置 |

| Total | 40(5Byte) | nothing |

最后的部分就是实际存储每个列的数据。

需要特别注意的是,NULL 不占该部分任何空间,即 NULL 除了占有 NULL 标志位,实际存储不占有任何空间。另外有一点需要注意的是,每行数据除了用户定义的列外,还有两个隐藏列,事务 1D 列和回滚指针列,分别为 6 字节和 7 字节的大小。若 InnoDB 表没有定义主键,每行还会增加一个 6 字节的 rowid 列。

RedundantMySQL 5 . 0 版本之前 InnoDB 的 行 记 录 存 储 方 式,这里就不展开。

2.2、行溢出数据


InnoDB 存储引擎可以将一条记录中的某些数据存储在真正的数据页之外。因为一般数据页默认大小为16KB,假如一个数据页存储不了插入的数据,这时肯定就会发生行溢出。

行数据溢出

一般认为 BLOBLOB 这类的大对象列类型的存储会把数据存放在数据页之外。但是,BLOB 也可以不将数据放在溢出页面,而且即便是 VARCHAR 列数据类型,依然有可能被存放为行溢出数据。

3、InnoDB 数据页结构

====================================================================================

页是 InnoDB 存储引擎管理数据库最小磁盘单位。页类型为 B-tree Node 的页存放的即是表中行的实际数据了。

InnoDB 数据页由以下 7 个部分组成:

先自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以扫码领取!

img

知其然不知其所以然,大厂常问面试技术如何复习?

1、热门面试题及答案大全

面试前做足功夫,让你面试成功率提升一截,这里一份热门350道一线互联网常问面试题及答案助你拿offer

2、多线程、高并发、缓存入门到实战项目pdf书籍

3、文中提到面试题答案整理

4、Java核心知识面试宝典

覆盖了JVM 、JAVA集合、JAVA多线程并发、JAVA基础、Spring原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB 、Cassandra、设计模式、负载均衡、数据库、一致性算法 、JAVA算法、数据结构、算法、分布式缓存、Hadoop、Spark、Storm的大量技术点且讲解的非常深入


ra、设计模式、负载均衡、数据库、一致性算法 、JAVA算法、数据结构、算法、分布式缓存、Hadoop、Spark、Storm的大量技术点且讲解的非常深入**

[外链图片转存中…(img-lY7dRXdX-1711436993633)]

[外链图片转存中…(img-RC68DgU8-1711436993633)]

[外链图片转存中…(img-V8YTlJQj-1711436993633)]
需要更多Java资料的小伙伴可以帮忙点赞+关注,点击传送门,即可免费领取!

标签:存储,字节,记录,笔记,InnoDB,MySQL,NULL,数据
From: https://blog.csdn.net/H1767410/article/details/137047095

相关文章

  • 网络流学习笔记
    网络流的核心在于建图。建图建出来之后,剩下的基本上只是模板了。1基本定义一个网络是一张有向图\((V,E)\),其中每条边都有一个流量\(c(u,v)\)。一个网络有一个源点\(S\)和一个汇点\(T\)。网络流满足以下几条性质:流函数\(f:(x,y)\rightarrow\text{R}\)是一个二......
  • OpenStack学习笔记03-OpenStack环境准备
    OpenStack学习笔记03-OpenStack环境准备OpenStackLinux对着《云操作系统(OpenStack)》第三章做的。一、系统环境配置1.为什么NAT模式网关不能填写XX.XX.XX.1?两天了,被这个问题纠缠两天了。虚拟机设置的是NAT模式,但是就是上不了外网。就是因为我把VMWare的NAT的网关改在了X......
  • JPA不识别MySQL的枚举类型
    1枚举好用吗?数据字典型字段,枚举比Integer好:限定值,只能赋值枚举的那几个实例,不能像Integer随便输,保存和查询的时候特别有用含义明确,使用时不需要去查数据字典显示值跟存储值直接映射,不需要手动转换,比如1在页面上显示为启用,0显示禁用,枚举定义好可以直接显示基于enum可以添加......
  • 深入学习MySQL1——体系结构、常见引擎、索引
    MySQL体系结构连接层:提供一些mysql的数据连接对象、用户校验、权限认证等服务服务层:在本层实现了一些核心功能,如SQL接口,缓存查询(8.0之后的版本已取消该功能)、SQL分析和优化,部分内置函数的执行。所有的跨存储引擎的功能都在这一层实现,如:过程、函数等。在该层,服务器会解析查询并......
  • MySQL日常练习——多表查询
    1、创建DDL——学生表——成绩表CREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,`pwd`varchar(36)DEFAULTNULL,`phone`varchar(11)DEFAULTNULL......
  • Mysql 常用SQL语句
    1、查看mysql中所有的数据库, show databases;2、创建库 createdatabase库名;(也可以用 create databaseifnotexists 库名; 表示如果库不存在再创建)例:create databaseifnotexists ecology;3、删除库 drop database 库名称4、创建一张......
  • 使用node更加方便的操作mysql数据库的小工具
    这是一个自己封装的小工具,能够更加方便的操作数据库地址:工具首页git仓库地址功能还在继续开发当中…安装npminstallmysqinfo已经引入mysql工具包,无需在项目中再次引入mysql工具包导入constdb=require('mysqinfo')获取数据库对象//db.dbconnect('m......
  • 前端面试题【笔记】
    1、判断字符串是否是这样组成的,第一个必须是字母,后面可以是字母、数字、下划线,总长度为5-20varreg=/^[a-zA-Z][a-zA-Z_0-9]{4,19}$/;//定义RegExp对象,大括号表示重复次数4-19次 reg.test("a1a__a1a__a1a__a1a__");//检查一个字符串中是否存在创建RegExp对象实例时所指定......
  • C51 单片机(STC89 C52RC)#笔记3
    Task1:基于51核心板设计一个按键计数器。要求:判断KEY1按下,每次按下按键后记录按动次数加1,并且能在数码管上显示,能够从0计数至99。#include<STC89C5xRC.H>voidDelayNums(unsignedintxms) //@11.0592MHz{ while(xms--) { unsignedchari,j; i=2; j=199;......
  • C51 单片机(STC89 C52RC)#笔记2
    Chapter4独立按键输入4.1按键检测原理当按键未按下时,输入芯片引脚的电平为高电平;按键按下时,输入芯片引脚上的电平为低电平。sbitKEY1=P3^2;//位定义P3^2;//判断是否被按下if(0==KEY1){......//按键按下处理}4.2按键软件去抖原理抖动:核心部件为弹性金属弹簧......