Innodb数据空间占用探索

了解数据存储空间占用,可以更方便我们再企业中对于数据库相关优化做评估。

一、查看当前数据表空间占用信息

首先这里准备一张数据库表约2.3w数据量:

CREATE TABLE `project` (
  `tenantsid` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户ID',
  `project_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `code` bigint(20) NOT NULL DEFAULT '0' COMMENT '项目编号',
  `name` varchar(72) COLLATE utf8_bin DEFAULT '' COMMENT '项目名称',
  PRIMARY KEY (`project_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=59840 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='项目档'  

查看表存储空间大小方式有很多

1、通过iinformation_schema.tables查看数据空间占用信息

select table_name,data_length,index_length from information_schema.tables where table_name = 'project';

 按照官网介绍:

DATA_LENGTH

对于MyISAMDATA_LENGTH 是数据文件的长度,以字节为单位。

对于InnoDBDATA_LENGTH 是为聚集索引分配的大约空间量(以字节为单位)。具体来说,它是聚集索引大小(以页为单位)乘以InnoDB页大小。

INDEX_LENGTH

对于MyISAMINDEX_LENGTH 是索引文件的长度,以字节为单位。

对于InnoDBINDEX_LENGTH 是为非聚集索引分配的大约空间量(以字节为单位)。具体来说,它是非聚集索引大小的总和(以页为单位)乘以 InnoDB页大小。

DATA_LENGTH  = 聚集索引大小(以页为单位)乘以InnoDB页大小

INDEX_LENGTH  = 非聚集索引大小(以页为单位)乘以InnoDB页大小

2、查看page页大小配置

show status like '%page_size%';

可以看到默认的页大小为16kb

3、查看当前project表聚簇索引使用了多少page

innodb_space -s ibdata1 -T firestation/project space-indexes

可以看到这里面PRIMARY一共分配了97个page页占用空间 = 97*16*1024 = 1,589,248可以看到正好是DATA_LENGTH大小

前面也说到了当97个表只是当前project真实数据占用的空间大小,对于表来说,还存在其他的的空间占用,比如缓存、元数据等等,所以DATA_LENTGTH表示的只是真实数据的大小。当然对于日常的空间占用评估是足够了。

那我们深入探索下,project真实存储空间占用情况。

4、查看project表使用总page数

innodb_space -s ibdata1 -T firestation/project space-page-type-summary

 可以看到project实际存储时使用到了704个page页,所以理论上应该占用空间704*16*1024=11,534,336

其实mysql在information_schema中提供了innodb系列的元数据表,它记录了innodb底层存储时真实的元数据信息,例如information_schema.innnodb_sys_tablespace(我这里是mysql5.7不同版本的名称不同,看官网说明)中就可以查看表真实存储空间大小。

5、查看project真实占用空间大小

select * from information_schema.innodb_sys_tablespaces where name = 'firestation/project';

  • FILE_SIZE

    文件的表观大小,表示未压缩的文件的最大大小。

  • ALLOCATED_SIZE

    文件的实际大小,即磁盘上分配的空间量。

可以看到这里的File_size就是上面通过真实数据page数计算出来的结果。

所以结论:

1、可以通过information_schema.table查看DATA_LENGTH,这个为当前主键索引也就是真实数据的空间占用大小。

2、可以通过information_schema.innodb_sys_tablespace 查看File_size,这个为当前project总占用空间大小

二、每行数据占用空间

其实通过上述的结论,就可以大致的评估出每行数据空间占用大小,总大小/行数,这里我们更深入了解下一行数据怎么计算的空间占用大小。

1、查看每一行数据占用空间大小

(1)首先先确定project存储tree一共为几层 , 这里先介绍一种查看到方式,后续在介绍另一种。

通过innodb_space工具查看:

这里可以看到PRIMARY索引一共分2层,第1层非叶子节点只有一个page,第2层叶子节点共95个page页,需要注意的是这里叶子节点为0层,依次往上推。

(2)查看每一层tree空间占用

1层,非叶子节点(此处为root节点):

innodb_space -s ibdata1 -T firestation/project -I PRIMARY -l 1 index-level-summary

page: page页编号,这里为3,也就是上面看到的root节点page编号

index:索引编号

level:当前page所处的层级

data:当前page占用空间大小

free:当前page空闲空间大小,因为page大小固定16kg,所以就会存在页用不满的现象

recoreds:当前page存储的数据行数,这里因为是非叶子节点,所以指的是主键行数。

min_key:当前页中最小的索引列,这里是主键。

0层,非叶子节点(此处为root节点):

从这里就可以看出来,大约每行数据占用15000/250 = 60字节空间

行空间占用和字段数据有密切的关系,如果字段占用空间小(比如字段栏位少,无长文本字段等)那page可以存储更多的行数,整体的占用空间小,B+树层级少,查询速度快。

这里以page#5为例,看下当前page页空间分布说明:

innodb_space -s ibdata1 -T firestation/project -p 5 page-illustrate

这张图就是展示了PAGE一个详细的空间结构,前面文章也介绍过,这里不再赘述。

可以看到Record Header + Record Data 是真实数据产生的空间占用 = 1631+13471 =15102也是验证了上面看到的page空间占用。

三、每行数据空间评估

根据上面的数据结果,选择一个project_id = 33819的一行数据,从空间上来看为15102字节/233 =64字节

当前行数据:

我们知道bigint占用8字节,varchar是不定长,一个汉字3字节。按照这样的算法

空间:8+8+8+12 = 36字节,远小于60字节,这是为什么呢?

这个就是需要了解行格式知识相关了:【Mysql】 InnoDB引擎深入- 行格式_mysql 5.6 innodb引擎 不支持行格式为:dynamic_Survivor001的博客-CSDN博客

首先确定我们目前的行格式是什么,这个很好确定:

根据行格式的知识,我们知道一行数据除了真实的数据之外还会记录一些额外的信息。

  • 在这里以project_id =33819数据大致计算下
  • 存在变长字段,且长度<255,则需要1个字节记录其长度(这里共1~2字节,记录最大值65535,所以这就是为什么一行数据不能超过这个阈值)
  • 记录头5个字节
  • 除此之外,数据里面处理记录真实数据外还记录其他内比如row_id(6字节),回滚指针(7字节)、事务id(6字节)
  • 总计:1+5+7+6+6= 25(字节)
  • 所以:真实数据36 + 25 ~= 60字节, 这样一看就差不多了。
  • 总结:
  • 一行数据一般来说差不多占用空间 = 25字节 + 字段栏位真实占用空间,当然如果一行数据存在大数据内容,可能一行数据就超过了page大小,就可能跨页,这个时候就会行溢出。需要更多的页来记录其内容,次数就会占用更多的空间,因为page本身也会有额外的空间占用。所以这就是为什么大数据栏位建议独立出来不要和普通字段放在一起,而text、blog有独立BLOB PAGE原因。
  • 行溢出:【Mysql】 InnoDB引擎深入- 行溢出_innodb行溢出-CSDN博客

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

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

相关文章

09-命令者模式-C语言实现

命令者模式是一个高内聚的模式&#xff0c; 其定义为&#xff1a; Encapsulate a request as an object,thereby letting you parameterize clients with different requests,queue or log requests,and support undoable operations.&#xff08;将一个请求封装成一个对象&…

almalinux centos8系统zlmediakit编译安装

脚本 # 安装依赖 gcc-c.x86_64 这个不加的话会有问题&#xff0c; cmake需要在线安装 sudo yum -y install gcc gcc-c libssl-dev libsdl-dev libavcodec-dev libavutil-dev ffmpeg git openssl-devel gcc-c.x86_64 cmake mkdir -p /home/zenglg cd /home/zenglg git clon…

【开箱即用】前后端同时开源!周末和AI用Go语言共同研发了一款笔记留言小程序!

大家好&#xff0c;我是豆小匠。 真的是当你在怀疑AI会不会取代人类的时候&#xff0c;别人已经用AI工具加速几倍的生产速度了… 周末体验了和AI共同开发的感受&#xff0c;小项目真的可以一人全干了… 本次实验使用的AI工具有两个&#xff1a;1. GitHub Copilot&#xff08;…

JVM运行时数据区域

文章目录 内存结构程序计数器&#xff08;寄存器&#xff09;虚拟机栈局部变量表两类异常状况 线程运行诊断 本地方法栈堆方法区运行时常量池串池&#xff08;StringTable&#xff09;字符串的拼接串池的位置StringTable垃圾回收StringTable性能调优 直接内存 内存结构 程序计…

blue beacon rssi 指纹室内定位数据集

数据集是开展实验的基础&#xff0c;搜集并分享。如果你有关于室内定位的问题&#xff0c;请联系博主。 namedatesetpapercommentBLEBeacon: A Real-Subject Trial Dataset from Mobile Bluetooth Low Energy Beaconshttps://github.com/dimisik/BLEBeacon-Datasethttps://arxi…

【云备份】业务处理

文章目录 1. 业务处理作用功能 2. 代码框架编写构造函数UpLoad ——文件上传请求ListShow —— 展示页面请求处理实现Download —— 下载请求的处理实现断点续传实现 1. 业务处理 作用 业务处理模块是对客户端的业务请求进行处理 功能 1.文件上传请求&#xff1a;备份客户端…

RK3568平台开发系列讲解(Linux系统篇)netlink 监听广播信息

** 🚀返回专栏总目录 文章目录 一、什么是netlink 机制二、netlink 的使用2.1、创建 socket2.2、绑定套接字2.3、接收数据沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍如何通过 netlink 监听广播信息。 一、什么是netlink 机制 Netlink 是 Linux 内核中…

反序列化漏洞详解(一)

目录 一、php面向对象 二、类 2.1 类的定义 2.2 类的修饰符介绍 三、序列化 3.1 序列化的作用 3.2 序列化之后的表达方式/格式 ① 简单序列化 ② 数组序列化 ③ 对象序列化 ④ 私有修饰符序列化 ⑤ 保护修饰符序列化 ⑥ 成员属性调用对象 序列化 四、反序列化 …

Stream

什么是Stream&#xff1f; 也叫Stream流&#xff0c;是jdk8开始新增的一套API&#xff0c;可以用来操作集合或者数组的数据 优势&#xff1a;Stream流大量的结合了Lambda的语法风格来编程&#xff0c;提供了一种更加强大&#xff0c;更加简单的方式操作集合或数组中的数据&am…

CTF-虚拟机-QEMU-前置知识-操作流程与源码阅读

文章目录 总览内存PCI设备PCI配置空间前64个字节对应源码Memorry空间的BARIO空间的BAR MMIOPMIOIspci访问PCI设备配置空间中的Memory空间和IO空间MMIOPMIO QQM&#xff08;qemu object model&#xff09;简洁概要将 TypeInfo 注册 TypeImpl&#xff1a;ObjectClass的初始化&…

新款任务悬赏拉新地推本地任务同城地区定位游戏试玩任务联盟众人帮威客兼职任务墙

新款任务悬赏拉新地推本地任务同城地区定位游戏试玩任务联盟众人帮威客兼职任务墙 源码开源无任何加密及授权 后端采用PHPTinkCMF 前端采用UniappVUE 网页端双端APP可封装小程序可对接公众号登录 采用原生混合框架&#xff0c;拒绝卡顿。 https://download.csdn.net/downl…

文件操作--IO

目录 ♫什么是文件 ♫文件路径 ♫文件类型 ♫文件的管理 ♪File的构造方法 ♪File的常用方法 ♫文件的内容操作 ♪InputStream ♪OutputStream ♪字符流读写文件 ♫Scanner与流对象 ♫什么是文件 文件在计算机里可以指“狭义”的文件&#xff08;指硬盘上的文件和目录&…

第一百八十七回 DropdownButton组件

文章目录 1. 概念介绍2. 使用方法2.1 DropdownButton2.2 DropdownMenuItem 3. 示例代码4. 内容总结5. 经验分享 我们在 上一章回中介绍了"DropdownMenu组件"相关的内容&#xff0c;本章回中将介绍 DropdownButton组件.闲话休提&#xff0c;让我们一起Talk Flutter吧…

基于SpringBoot学生宿舍管理系统的设计与开发

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对学生宿舍信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差…

javaee实验:MVC 框架技术应用——URL 映射及方法参数的使用

目录 urlmvc框架mvc框架的设计mvc流程 实验目的实验内容实验过程创建项目创建项目结构编写代码简单测试一下 url 和 Hypertext 以及 HTTP 一样&#xff0c;URL 是 Web 中的一个核心概念。它是浏览器用来检索 web 上公布的任何资源的机制 URL 代表着是统一资源定位符&#xff…

OpenCV技术应用(6)— 暖色滤镜和冷色滤镜

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。本节课就手把手教大家如何将一幅图像转化成暖色滤镜和冷色滤镜&#xff0c;希望大家学习之后能够有所收获~&#xff01;&#x1f308; 目录 &#x1f680;1.技术介绍 &#x1f680;2.暖色滤镜 &#x1f680;3.冷色滤…

每日一练:阿姆斯特朗数

1. 概述 阿姆斯特朗数&#xff08;Armstrong number&#xff09;&#xff0c;也称为自恋数、自幂数&#xff08;narcissistic number&#xff09;、水仙花数&#xff0c;是指一个n位数&#xff08;n≥3&#xff09;&#xff0c;它的每个位上的数字的n次幂之和等于它本身。换句话…

AVFormatContext协议层:理论与实战

文章目录 前言一、协议操作对象结构二、初始化 AVIOContext 函数调用关系三、avio 实战 1&#xff1a;打开本地文件或网络直播流1、示例源码2、运行结果①、解决方法 1②、解决方法 2 四、avio 实战 2&#xff1a;自定义 AVIO1、示例源码2、运行结果 五、avio 实战 3&#xff1…

Vivado版本控制

Vivado版本控制 如果您有幸进入FPGA领域&#xff0c;那么会遇到版本控制问题&#xff0c;本文讲解的是如何用git进行Vivado进行版本控制。 搭建Git环境 一 首先需要一个git环境&#xff0c;并选择一个托管平台&#xff08;github,gitlab,gitee&#xff09; Git下载地址&…

【广州华锐视点】广东3D展厅开发服务找广州华锐视点,打造未来展览新体验!

随着科技的不断发展&#xff0c;人们对于信息获取和传播的方式也在不断创新。传统的实体展览馆在空间、时间、地域等方面存在诸多限制&#xff0c;而3D数字展厅则为我们提供了一个全新的解决方案。广州华锐互动致力于为客户提供专业的3D数字展厅定制开发服务&#xff0c;让您的…