Innodb数据结构空间占用

news2024/11/26 16:30:46

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

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

首先这里准备一张数据库表约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博客

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

双击热备方案实现(全)

双击热备是应用与服务器的一种解决方案&#xff0c;其构造思想是主机和从机通过TCP/IP网络连接&#xff0c;正常情况下主机处于工作状态&#xff0c;从机处于监视状态&#xff0c;一旦从机发现主机异常&#xff0c;从机将会在很短的时间内代替主机。完全实现主机的功能。 要想实…

odoo15关于tree视图添加按钮说明

1、odoo15的tree已经可以像form一样直接添加header标签 2、选取具体数据后&#xff0c;按钮出现&#xff0c;只需要在按钮中添加具体功能即可&#xff0c;下面是一个继承 3、效果&#xff1a;

JVM之四种引用类型(五)

JVM 系列吊打面试官&#xff1a;说一下 Java 的四种引用类型 四种引种类型 1.强引用 在 Java 中最常见的就是强引用&#xff0c;把一个对象赋给一个引用变量&#xff0c;这个引用变量就是一个强引用。当一个对象被强引用变量引用时&#xff0c;它处于可达状态&#xff0c;它是…

如何通过添加香港高防IP来防御攻击?

​  针对外贸建站&#xff0c;租用香港服务器&#xff0c;除了站长们较为关注的价格外&#xff0c;安全性也是至关重要的。香港服务器在使用中可能会遭受到常见的 DDoS 网络攻击&#xff0c;而在 DDoS 防护这一块&#xff0c;您可以使用香港 DDoS 高防 IP 和香港高防服务器来…

基于51单片机多功能时钟闹钟系统

**单片机设计介绍&#xff0c;基于51单片机多功能时钟闹钟系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于51单片机的多功能时钟闹钟系统是一种基于单片机的电子设备&#xff0c;能够显示时间、设置闹钟、进行计时以及提…

解决方案:Mac 安装 pip

python3 --version 通过以下命令来下载pip&#xff1a; curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py curl命令允许您指定一个直接下载链接。使用-o选项来设置下载文件的名称。 通过运行以下命令安装下载的包&#xff1a; python3 get-pip.py

POJ 3233 Matrix Power Series 动态规划(矩阵的幂)

一、题目大意 给出一个矩阵A&#xff0c; 输出矩阵B的每一项对M取余数的值。 二、解题思路 以二维矩阵为例&#xff0c;首先计算K2的情况&#xff0c;我们设结果矩阵为B 有如下表达式 那么不难看出&#xff0c;需要的矩阵其实就是以下的两个矩阵相乘后的左上角的N*N个 然后…

Linux中的UDEV机制与守护进程

Linux中的UDEV守护进程 udev简介守护进程守护进程概念守护进程程序设计守护进程的应用守护进程和后台进程的区别 UDEV的配置文件自动挂载U盘 udev简介 udev是一个设备管理工具&#xff0c;udev以守护进程的形式运行&#xff0c;通过侦听内核发出来的uevent来管理/dev目录下的设…

3.4 路由器的DHCP配置

实验3.4 路由器的DHCP配置 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施&#xff08;一&#xff09;配置基于接口地址池的DHCP1.交换机的基本配置2.路由器的基本配置3.开启路由器的DHCP服务器功能4.配置路由器接口的DHCP功能5.设置计算机使用DHCP方式获取IP地…

前端又出新轮子Nue.js,但还是低代码更香!

前言 别TM卷了&#xff01;&#xff01;&#xff01; 自从前后端分离以来&#xff0c;前端前端的车轮滚滚向前&#xff0c;轮子造的越来越圆。每个人都在适应这个轮子的节奏&#xff0c;稍微不注意就会被甩出车轮之外。 调侃归调侃&#xff0c;既然口子已经开了&#xff0c;…

Java操作Excel之 POI介绍和入门

POI是Apache 提供的一个开源的Java API&#xff0c;用于操作Microsoft文档格式&#xff0c;如Excel、Word和PowerPoint等。POI是Java中处理Microsoft文档最受欢迎的库。 截至2023/12&#xff0c; 最新版本时 POI 5.2.5。 JDK版本兼容 POI版本JDK版本4.0及之上版本> 1.83.…

游戏测试 vs 软件测试:你知道它们的真正区别吗?

游戏测试和软件测试有什么区别&#xff1f;10大测试点对比&#xff01; 针对手游而言&#xff0c;游戏测试的本质是APP&#xff0c;所以不少手游的测试方式与APP测试异曲同工&#xff0c;然而也有所不同。APP更多的是具有一种工具&#xff0c;一款APP好不好用不重要&#xff0…

【译】DispatcherServlet

1.1. DispatcherServlet 见 Reactive 技术栈中的等效内容 Spring MVC和其他许多Web框架一样&#xff0c;是围绕前端控制器模式设计的&#xff0c;其中一个中央 Servlet&#xff0c;即 DispatcherServlet&#xff0c;为请求处理提供了一个共享算法&#xff0c;而实际工作则由可…

Unity 网格布局控件-Grid Layout Group

Unity 网格布局控件-Grid Layout Group是Unity中的UGUI控件&#xff0c;用于在 UI 中创建网格布局&#xff0c; 它的作用是&#xff1a;自动将子对象排列成网格&#xff0c;即我们可以通过该组件对子对象按行和列的形式排列&#xff0c;根据指定的约束条件自动调整它们的大小和…

【网络安全】红蓝对抗之企业互联网安全防护

01 什么是“红蓝对抗”&#xff1f; “红蓝对抗”最早起源于古罗马军队&#xff0c;在沙盘中用红色和蓝色来代表敌人和自己&#xff0c;他们认为蓝色代表勇敢和忠诚&#xff0c;红色代表血腥和暴力&#xff0c;所以选择用蓝色代表自己。 在中国&#xff0c;由于传统习俗与文化…

卡码网语言基础课 | 19. 洗盘子

目录 一、 栈的基本概念 二、 栈的操作 2.1 引入头文件 2.2 创建栈 2.3 栈的基本认识 三、 解答 通过本次练习&#xff0c;将学习到以下 C知识点&#xff1a; 栈的基本概念&#xff08;空栈、栈顶、栈底&#xff09;和特点&#xff08;先入后出&#xff09;入栈、出栈、获取…

高性能网络编程 - 白话TCP 三次握手过程

文章目录 概述TCP协议头的格式TCP Finite State Machine (FSM) 状态机三次握手如何在 Linux 系统中查看 TCP 状态 概述 每一个抽象层建立在低一层提供的服务上&#xff0c;并且为高一层提供服务。 我们需要知道 TCP在网络OSI的七层模型中的第四层——Transport层 -----------…

2023年1月18日 Go生态洞察:开发者的声音与Go的进化

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

算法--最短路

这里写目录标题 xmind单源最短路简介所有边权都是正朴素的Dijkstra算法思想例子题解 堆优化版的Dijkstra算法 存在负数权Bellman-Ford算法思想例子题解 多源汇最短路简介 xmind 上述中&#xff0c;朴素Dijkstra算法适用于稠密图 其他用堆优化版 而SPFA算法一般都比Bellman-For…

AIGC发展史

1 AIGC概况 1.1 AIGC定义 AIGC&#xff08;AI Generated Content&#xff09;是指利用人工智能技术生成的内容。它也被认为是继PGC,UGC之后的新型内容生产方式&#xff0c;AI绘画、AI写作等都属于AIGC的具体形式。2022年AIGC发展速度惊人&#xff0c;迭代速度更是呈现指数级发…