百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程文章 > 正文

MYSQL存储引擎InnoDB(六十七):文件空间管理

qiyuwang 2025-04-09 19:53 7 浏览 0 评论

您使用innodb_data_file_path 配置选项来将数据文件形成InnoDB系统表空间。这些文件在逻辑上连接起来形成系统表空间。使用中没有连续化。您无法定义在系统表空间中表被分配的位置。在新创建的系统表空间中,InnoDB从第一个数据文件开始分配空间。

为避免在系统表空间中存储所有表和索引所带来的问题,您可以启用 innodb_file_per_table 配置选项(默认)。它将每个新创建的表存储在单独的表空间文件中(扩展名为 .ibd)。对于以这种方式存储的表,磁盘文件中的碎片较少,并且当表被截断时,空间将返回给操作系统,而不是仍然由 InnoDB 在系统表空间中保留。

您还可以将表存储在通用表空间中。通用表空间是使用CREATE TABLESPACE 语法创建的共享表空间。它们可以在 MySQL 数据目录之外创建,能够保存多个表,并支持所有行格式的表。


页面、区、段和表空间

每个表空间由数据库 页组成。MySQL 实例中的每个表空间都具有相同的页面大小。默认情况下,所有表空间的页大小为 16KB;您可以通过在创建 MySQL 实例时指定innodb_page_size选项将页面大小减小到 8KB 或 4KB 。您还可以将页面大小增加到 32KB 或 64KB。

对于最大为 16KB 的页面(64 个连续的 16KB 页面,或 128 个 8KB 页面,或 256 个 4KB 页面), 这些页面被分组为大小为1MB的区。对于 32KB 的页面大小,区大小为 2MB。对于 64KB 的页面大小,区大小为 4MB。这些表空间中的 “文件”在InnoDB中被称为段。

当一个段在表空间内增长时, InnoDB一次将前 32 页分配给它。之后,InnoDB开始将整个区分配给段。InnoDB 一次最多可以将4个区添加到一个大段中,以确保数据的良好顺序性。

InnoDB为每个索引分配两个段 。一个用于 B-tree的非叶子节点,另一个用于叶子节点。保持叶节点在磁盘上的连续性可以实现更好的顺序 I/O 操作,因为这些叶节点包含实际的表数据。

表空间中的某些页面包含其他页面的位图,因此InnoDB 表空间中的一些扩展区不能作为一个整体分配给段,而只能作为单独的页面分配。

当您通过发出SHOW TABLE STATUS 语句请求表空间中的可用空闲空间时,InnoDB报告表空间中绝对空闲的范围。InnoDB 始终保留一些范围用于清理和其他内部目的;这些保留区不包括在可用空间中。

当您从表中删除数据时,InnoDB 收缩相应的 B 树索引。释放的空间是否可供其他用户使用取决于删除模式是否释放单个页面或表空间的范围。删除表或从中删除所有行可以保证将空间释放给其他用户,但请记住,删除的行仅通过清除操作物理删除,这在事务回滚或一致读取不再需要它们后的一段时间内自动发生。


配置保留文件段页面的百分比

MySQL 8.0.26 中引入的
innodb_segment_reserve_factor 变量是一项高级功能,允许定义保留为空页的表空间文件段页的百分比。保留一定百分比的页面以供将来增长,以便可以连续分配 B 树中的页面。修改保留页面百分比的能力允许微调InnoDB以解决数据碎片或存储空间使用效率低下的问题。

该设置适用于独立表空间和通用表空间。默认设置为 12.5%,这
innodb_segment_reserve_factor 与以前的 MySQL 版本中保留的页面百分比相同。


innodb_segment_reserve_factor 变量是动态的,可以使用 SET语句进行配置。例如:

mysql> SET GLOBAL innodb_segment_reserve_factor=10;


页面与行的关系

对于 4KB、8KB、16KB 和 32KB 的innodb_page_size设置,最大行长度略小于数据库页面大小的一半。例如,对于默认的 16KB InnoDB页大小,最大行长度略小于 8KB 。对于 64KB的innodb_page_size 设置,最大行长度略小于 16KB。

如果一行未超过最大行长度,则所有行都本地存储在页面内。如果行超过最大行长度, 则选择可变长度列用于外部页外存储,直到该行符合最大行长度限制。可变长度列的外部页外存储因行格式而异。

LONGBLOB和LONGTEXT列必须小于 4GB,包括BLOB和TEXT列在内的总行长必须小于 4GB。

相关推荐

基于Docker方式安装与部署Camunda流程引擎

1Camunda简介官网:https://docs.camunda.org/manual/7.19/installation/docker/Camunda是一个轻量级、开源且高度灵活的工作流和决策自...

宝塔Linux面板如何部署Java项目?(宝塔面板 linux)

通过宝塔面板部署Java还是很方便的,至少不需要自己输入tomcat之类的安装命令了。在部署java项目前,我还是先说下目前的系统环境,如果和我的系统环境不一样,导致部署不成功,那你可能需要去找其他资...

浪潮服务器如何用IPMI安装Linux系统

【注意事项】此处以浪潮服务器为例进行演示所需使用的软件:Chrome浏览器个人PC中需要预先安装java,推荐使用jdk-8u181-windows-x64.exe【操作步骤】1、在服务器的BIOS中...

Centos7环境Hadoop3集群搭建(hadoop集群环境搭建实验报告)

由于项目需要存储历史业务数据,经过评估数据量会达到100亿以上,在原有mongodb集群和ES集群基础上,需要搭建Hbase集群进行调研,所以首先总结一下Hadoop集群的搭建过程。一、三个节点的集群...

Hadoop高可用集群搭建及API调用(hadoop高可用原理)

NameNodeHA背景在Hadoop1中NameNode存在一个单点故障问题,如果NameNode所在的机器发生故障,整个集群就将不可用(Hadoop1中虽然有个SecorndaryNameNo...

使用Wordpress搭建一个属于自己的网站

现在开源的博客很多,但是考虑到wordpress对网站的seo做的很好,插件也多。并且全世界流量排名前1000万的网站有33.4%是用Wordpress搭建的!所以尝试用Wordpress搭建一个网站...

Centos 安装 Jenkins(centos 安装ssh)

1、Java安装查看系统是否已安装Javayumlistinstalled|grepjava...

Java教程:gitlab-使用入门(java中的git)

1导读本教程主要讲解了GitLab在项目的环境搭建和基本的使用,可以帮助大家在企业中能够自主搭建GitLab服务,并且可以GitLab中的组、权限、项目自主操作...

Dockerfile部署Java项目(docker部署java应用)

1、概述本文主要会简单介绍什么是Docker,什么是Dockerfile,如何安装Docker,Dockerfile如何编写,如何通过Dockerfile安装jar包并外置yaml文件以及如何通过do...

如何在Eclipse中搭建Zabbix源码的调试和开发环境

Zabbix是一款非常优秀的企业级软件,被设计用于对数万台服务器、虚拟机和网络设备的数百万个监控项进行实时监控。Zabbix是开放源码和免费的,这就意味着当出现bug时,我们可以很方便地通过调试源码来...

Java路径-02-Java环境配置(java环境搭建及配置教程)

1Window环境配置1.1下载...

35.Centos中安装python和web.py框架

文章目录前言1.Centos7python:2.Centos8python:3.进行下载web.py框架然后应用:4.安装好之后进行验证:5.总结:前言...

《我的世界》服务器搭建(我的世界服务器如何搭建)

1.CentOS7环境1.1更改YUM源#下载YUM源文件curl-o/etc/yum.repos.d/CentOS-Base.repohttps://mirrors.aliyun.com...

CentOS 7 升级 GCC 版本(centos7.4升级7.5)

1.GCC工具介绍GCC编译器:...

Linux安装Nginx详细教程(linux安装配置nginx)

环境准备1.因为Nginx依赖于gcc的编译环境,所以,需要安装编译环境来使Nginx能够编译起来。命令:yuminstallgcc-c++显示完毕,表示安装完成:2.Nginx的http模块需要...

取消回复欢迎 发表评论: