当前位置: 首页 > news >正文

MySQL的InnoDB的页里面存了些什么 --InnoDB存储梳理(三)

文章目录

  • 创建新表页的信息
  • 新增一条数据
  • 根据页号找数据信息
  • 脚本代码
    • py_innodb_page_info
    • 根据地址计算页号
    • 根据页号计算起始地址

主要介绍表空间索引页里面有哪些内容,数据在表空间文件里面是怎么组织的

创建新表页的信息

CREATE TABLE `test8` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`name` varchar(50) NOT NULL DEFAULT '' COMMENT '姓名',`finish` tinyint(1) DEFAULT '0' COMMENT '完成状态',`uid` varchar(64) NOT NULL DEFAULT '' COMMENT '用户ID信息',`external1` varchar(512) NOT NULL DEFAULT '' COMMENT '大字段信息1',`external2` varchar(512) NOT NULL DEFAULT '' COMMENT '大字段信息2',`external3` varchar(512) NOT NULL DEFAULT '' COMMENT '大字段信息3',`external4` varchar(512) NOT NULL DEFAULT '' COMMENT '大字段信息4',`external5` varchar(512) NOT NULL DEFAULT '' COMMENT '大字段信息5',`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '缓存时间',PRIMARY KEY (`id`) USING BTREE,KEY `idx_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='测试信息表8';

新建一个测试表test8,然后看看缓冲池里的页的变化。把表test8的一些页加载进来了,看最后一列INDEX_NAME有个PRIMARYidx_name两个索引的名称,一个是主键索引,一个是辅助索引;因为InnoDB是聚簇索引形式的,主键索引的叶子节点就包含了数据。
在这里插入图片描述

FILE_SPACE_HEADER页增加了1个,是把test8FILE_SPACE_HEADER页加载进来了,IBUF_BITMAP页多了7个是除了加载了test8的这个页,还加载了其他test数据库下的表进来…
在这里插入图片描述

再看这个表空间里面有什么,7个页112k,MySQL初始创建表不是只有96k么?为啥这多了16k;MySQL建一个一般的表确实只给6个页的空间;但是我们这边张表多了个索引,它就给索引也分配了一个页。试了下如果两个索引的话,会多给两个页,就是多几个索引就多几个页。
在这里插入图片描述

使用命令hexdump -C test8.ibd输出页格式化的二进制信息;页的类型信息在第25,26两个字节的位置。

截图里面的 * 号代表这一行的数据和上一行一样,省略了

在这里插入图片描述在这里插入图片描述
主键索引页和辅助索引页类型的值都是0x45bf,所以他们都是INDEX页,主键索引叶子节点会存放数据,辅助索引就是单纯的辅助索引,要整行数据需要再到主键索引下去找。

所有的页面类型信息,见源码storage/innobase/include/fil0fil.h
在这里插入图片描述

新增一条数据

INSERT INTO `test8` (`name`, `finish`, `uid`, `external1`, `external2`, `external3`, `external4`, `external5`, `create_time`)
VALUES('name001', 0, 'uid001', 'aaaaaaaa', 'bbbbbbbb', 'cccccccc', 'dddddddd', 'eeeeeeee', '2024-08-04 18:09:35');

页还是那么几个,没什么变化,NEWEST_MODIFICATION变化了,这代表LSN号;我们每次提交事务的时候,数据都会刷新到redo log里面,会有这个日志序列号LSN,代表页面有变化了;行数就像我们看到的1行,数据的大小变了。
在这里插入图片描述
LSN在页中的位置是页面类型前面的8个字节,可以自己输出看看文件里面的前8个字节的数转换成十进制是不是这么多。

再用hexdump命令看看test8.ibd文件
主键索引页的大小92个字节:画红线的字节前面7个字节是varchar字符串的这个记录每个信息的长度,逆序存放的的;再后面1个字节是代表哪个位置为null的,后面5个字节是记录头信息;第一个蓝线是主键ID,紧接着是Transaction IDRoll Pointer,最后画红线的是时间字段信息,剩下的看得出来是我们插入的记录,加起来92个字节
在这里插入图片描述

辅助索引页的大小21个字节:前面6个字节varchar的长度以及记录头信息,索引字段name0017个字节,主键ID 8个字节,加起来21个字节。
在这里插入图片描述

下面我们到一个数据多一点的表里面去找找数据

根据页号找数据信息

我这边前面测试的时候建过一个test2表,插入了上百万条数据,我们看看缓冲池里面加载了些什么数据进来,这是目前在缓冲池里面的页的数据
在这里插入图片描述
我们看看页号101的数据是哪些数据,计算出它的起始地址是0x194000,它是一个INDEX页,独立表空间里面基本上都是索引页了;0x1242 的十进制是4674;查询出来就是这条数据了
在这里插入图片描述
在这里插入图片描述

我们再找个二级索引页,执行下索引列的统计sqlMySQL缓冲池就会把索引页加载进来了
在这里插入图片描述
我们看看页号23751的数据是哪些数据,计算出它的起始地址是0x1731c000,它是一个二级索引页(第56-64个字节有值,就是二级索引页,表示修改当前页的最大事务ID,仅在二级索引中定义,聚簇索引没有),独立表空间里面基本上都是数据页了;0x03e7cf 的十进制是255951;查询出来这行数据的索引列就是这个
在这里插入图片描述在这里插入图片描述
好了,差不多就写这么多了,还有不少其他不明白的细节,以后再慢慢了解吧!

  1. mysql的有符号正数,为什么最高位是1?

脚本代码

py_innodb_page_info

https://github.com/yjysanshu/py_innodb_page_info

根据地址计算页号

page_size_bytes = 16 * 1024     # 16k# hexdump 打印出来的地址
hex_address = "00004010"
address = int(hex_address, 16)print("页号: " + str(address // page_size_bytes))
print("偏移地址: " + str(hex(address % page_size_bytes)))

根据页号计算起始地址

page_no = 23502
print(hex(page_no * page_size_bytes))

!!!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • .NET 8 跨平台高性能边缘采集网关
  • leetcode日记(72)最大矩形
  • 一文彻底搞懂Transformer - 总体架构
  • 后端开发学习路线
  • 蜂鸣器(51单片机)
  • 苹果微信不小心卸载了怎么恢复聊天记录?4招轻松解决
  • GPT-5:未来已来,你准备好了吗
  • Midjourney应用-用AI帮你做广告视频(动物走秀视频制作)
  • 第七节 流编辑器sed(stream editor)(7.2)
  • 三十六、【人工智能】【机器学习】【监督学习】- Bagging算法模型
  • 解决NLP任务的Transformer为什么可以应用于计算机视觉?
  • 16. 数值的整数次方
  • 论文分享|MLLMs中多种模态(图像/视频/音频/语音)的tokenizer梳理
  • 【Java-一些常见键值对集合面试问题】
  • 学习笔记 韩顺平 零基础30天学会Java(2024.8.8)
  • JavaScript-如何实现克隆(clone)函数
  • 【刷算法】求1+2+3+...+n
  • canvas 绘制双线技巧
  • Javascript弹出层-初探
  • JS专题之继承
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • passportjs 源码分析
  • PHP变量
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • 闭包--闭包之tab栏切换(四)
  • 二维平面内的碰撞检测【一】
  • 翻译--Thinking in React
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 深入浅出webpack学习(1)--核心概念
  • 微信小程序:实现悬浮返回和分享按钮
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • ​力扣解法汇总946-验证栈序列
  • # include “ “ 和 # include < >两者的区别
  • # Panda3d 碰撞检测系统介绍
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #WEB前端(HTML属性)
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (007)XHTML文档之标题——h1~h6
  • (160)时序收敛--->(10)时序收敛十
  • (3)llvm ir转换过程
  • (bean配置类的注解开发)学习Spring的第十三天
  • (补充)IDEA项目结构
  • (转)jQuery 基础
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)Sql Server 保留几位小数的两种做法
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .chm格式文件如何阅读
  • .gitignore文件设置了忽略但不生效
  • .mysql secret在哪_MYSQL基本操作(上)
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .Net Core和.Net Standard直观理解
  • .Net Redis的秒杀Dome和异步执行
  • .net2005怎么读string形的xml,不是xml文件。
  • .NET程序集编辑器/调试器 dnSpy 使用介绍