InnoDB中的INT怎么存储的

简介: InnoDB中的INT怎么存储的

一、问题来源

如果我们查看show egnine innodb查看锁记录的时候往往会看到Innodb的数字使用类似

80000001的形式显示如下:

Record lock, heap no 2 PHYSICAL RECORD: n_fields 4; compact format; info bits 0
 0: len 1; hex 31; asc 1;;
 1: len 1; hex 31; asc 1;;
 2: len 1; hex 80; asc  ;;
 3: len 8; hex 8000000000000001; asc         ;;

这里是一个有符号的bigint的显示。本文就来说一下这个值是这么计算出来的。本文以4字节的int为例。

二、源码部分

关于转换的部分主要集中在函数 row_mysql_store_col_in_innobase_format 中,我们来看一下数字的转换代码如下:

if (type == DATA_INT) {

/* Store integer data in Innobase in a big-endian format,
sign bit negated if the data is a signed integer. In MySQL,
integers are stored in a little-endian format. */

//p指针指向buf的最高地址,反向获取数据得到大端buffer时
byte* p = buf + col_len;

for (;;) {
p--;
p = mysql_data; //转大端
if (p == buf) { //如果存储完成
break;
}
mysql_data++;
}

if (!(dtype->prtype & DATA_UNSIGNED)) {//如果为有符号类型

*buf ^= 128;
}

ptr = buf; //PTR指向 buffer低地址
buf += col_len;//buf指向 buffer的高地址
}
...

//存入dtuple中,里面很简单就是取void* 存进去进行了。
dfield_set_data(dfield, ptr, col_len);

这里的关键部分就是对于有 *buf ^= 128 这部分,实际上就是转换为大端后的最低位做一个异或操作。

最终操作为函数 page_cur_tuple_insert 会将这个dtuple插入到实际的数据文件其中有一个函数为 rec_convert_dtuple_to_rec_comp,会获得最终的物理记录,其中的代码memcpy(end, dfield_get_data(field), len),可以看到实际存入物理记录的就是这里的转换后的值。

三、实例解析

1. 有符号

正数:以数字5为例子,其4字节的表示方法为0x05 0x00 0x00 0x00,这里还是小端形式为MySQL层传入的值。Innodb转换方式如下:

  • 从高地址开始取,转换为大端形式,转换后为
    0x00 0x00 0x00 0x05
  • 如果为有符号类型转换为大端后的最低位做一个异或操,转换为
    0x80 0x00 0x00 0x05

负数:以数字-5为例子,其4字节的表示方法为0xfb 0xff 0xff 0xff(补码),这里还是小端形式为MySQL层传入的值。Innodb转换方式如下:

  • 从高地址开始取,转换为大端,转换后为
    0xff 0xff 0xff 0xfb
  • 如果为有符号类型转换为大端后的最低位做一个异或操,转换为
    0x7f 0xff 0xff 0xfb
2、无符号

这个比较简单,直接原始值大端输出即可,不做最后的异或操作。

四、测试


我们为了测试就建立一个表如下:

create table testint(id int primary key);
insert into testint values(5),(-5);


然后使用innblock和bcview查看二进制文件中存储的方式。

第一行记录为:

image.png


转换如下:

80000005 实际记录5
000000014224 trx id
bd000000230110 roll ptr

第二行记录为:

image.png


7ffffffb 实际记录-5
000000014224 trx id
bd00000023011d roll ptr

我们可以发现我们的分析是正确,确实物理文件中也是这样存储的。

            </div>
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
网络协议 应用服务中间件 Linux
|
8月前
|
消息中间件 搜索推荐 调度
RocketMQ实战—8.营销系统业务和方案介绍
本文详细介绍了电商营销系统的业务流程、技术架构及挑战解决方案。涵盖核心交易与支付后履约流程,优惠券和促销活动的发券、领券、用券、销券机制,以及会员与推送的数据库设计。技术架构基于Nacos服务注册中心、Dubbo RPC框架、RocketMQ消息中间件和XXLJob分布式调度工具,实现系统间高效通信与任务管理。针对千万级用户量下的推送和发券场景,提出异步化、分片处理与惰性发券等优化方案,解决高并发压力。同时,通过RocketMQ实现系统解耦,提升扩展性,并利用XXLJob完成爆款商品推荐的分布式调度推送。整体设计确保系统在大规模用户场景下的性能与稳定性。
RocketMQ实战—8.营销系统业务和方案介绍
|
8月前
|
搜索推荐 数据挖掘 数据安全/隐私保护
频率派与贝叶斯统计在营销组合建模中的应用比较:隐私优先时代的方法选择
营销组合建模(MMM)是量化营销渠道贡献的核心工具,在数字营销进入隐私优先时代后焕发新生。文章探讨了频率派与贝叶斯统计学在MMM中的应用,前者实现简单、结果直观,适合数据充足场景;后者能整合先验知识、量化不确定性,适应复杂和数据稀缺情况。两者各有优劣,选择需结合业务需求与数据条件。贝叶斯方法在隐私保护趋势下尤为重要,为未来营销分析提供新思路。
251 47
频率派与贝叶斯统计在营销组合建模中的应用比较:隐私优先时代的方法选择
|
Cloud Native Devops 云计算
云计算的未来:云原生架构与微服务的革命####
【10月更文挑战第21天】 随着企业数字化转型的加速,云原生技术正迅速成为IT行业的新宠。本文深入探讨了云原生架构的核心理念、关键技术如容器化和微服务的优势,以及如何通过这些技术实现高效、灵活且可扩展的现代应用开发。我们将揭示云原生如何重塑软件开发流程,提升业务敏捷性,并探索其对企业IT架构的深远影响。 ####
358 3
|
人工智能 小程序
【一步步开发AI运动小程序】十五、AI运动识别中,如何判断人体站位的远近?
【云智AI运动识别小程序插件】提供人体、运动及姿态检测的AI能力,无需后台支持,具有快速、体验好、易集成等特点。本文介绍如何利用插件判断人体与摄像头的远近,确保人体图像在帧内的比例适中,以优化识别效果。通过`whole`检测规则,分别实现人体过近和过远的判断,并给出相应示例代码。
|
编解码 算法 索引
基于simulink的模拟锁相环和数字锁相环建模与对比仿真
本研究利用Simulink对模拟锁相环(PLL)和数字锁相环(DPLL)进行建模,通过对比两者的收敛曲线及锁定频率值,分析其性能差异。系统采用MATLAB2022a版本,详细介绍了PLL和DPLL的工作原理,涵盖鉴相器、滤波器及振荡器等关键组件的功能与数学描述。
|
编解码 人工智能
FreeScale:无需微调即可提升模型的图像生成能力,生成 8K 分辨率的高质量图像
FreeScale是一个无需微调的推理框架,旨在提升扩散模型生成高分辨率图像和视频的能力。该框架通过处理和融合不同尺度的信息,首次实现了8K分辨率图像的生成,显著提高了生成内容的质量和保真度,同时减少了推理时间。
319 20
FreeScale:无需微调即可提升模型的图像生成能力,生成 8K 分辨率的高质量图像
|
存储 边缘计算 5G
|
Java Maven Spring
SpringBoot系列教程web篇之重定向
前面介绍了spring web篇数据返回的几种常用姿势,当我们在相应一个http请求时,除了直接返回数据之外,还有另一种常见的case -> 重定向; 比如我们在逛淘宝,没有登录就点击购买时,会跳转到登录界面,这其实就是一个重定向。本文主要介绍对于后端而言,可以怎样支持302重定向
794 0
SpringBoot系列教程web篇之重定向
|
关系型数据库 MySQL Java
树莓派4B使用Docker部署SpringBoot项目——(二)使用docker安装mysql
树莓派4B使用Docker部署SpringBoot项目——(二)使用docker安装mysql
965 0
树莓派4B使用Docker部署SpringBoot项目——(二)使用docker安装mysql