MySQL 回收表碎片实践教程

前言:

在 MySQL 数据库中,随着数据的增删改操作,表空间可能会出现碎片化,这不仅会占用额外的存储空间,还可能降低表的扫描效率,特别是一些大表,在进行数据清理后会产生大量的碎片。本篇文章我们一起来学习下如何进行碎片回收以及相关注意点。

查看表碎片大小

一般 MySQL 数据库都是开启 innodb_file_per_table 参数的,这代表每个表使用独立的表空间,即每个表的数据及索引存储在一个独立的 表名.ibd 文件里,如果某个表有大量碎片,ibd 文件占用磁盘空间会非常大,碎片回收掉后 ibd 文件也会显著减小。

首先我们要确定哪些表需要进行回收碎片操作,MySQL 系统表 information.TABLES 中的 DATA_FREE 字段显示的是可用的空闲空间量(单位:字节),它可以帮助你估计碎片的程度,如果 DATA_FREE 很大,那么这个表的碎片量一般也比较大。

如果某个表比较大或者变动特别频繁,你可以看下这个表的 DATA_FREE 大小,看是否需要回收碎片,也可以从系统表中筛选出碎片量大于 100M 的表或者碎片率达到多少的表,这类表一般是需要进行碎片回收的。下面几条查询 SQL 可能对你有所帮助:

# 查看某个表的详细信息(包含碎片大小)
select 
table_schema as '数据库',
TABLE_NAME as '表名',
sys.FORMAT_BYTES(data_length) as '数据容量',
sys.FORMAT_BYTES(index_length) as '索引容量',
sys.FORMAT_BYTES(data_length+index_length) as '总容量' ,
sys.FORMAT_BYTES(DATA_FREE) as '碎片大小'
from information_schema.tables where TABLE_SCHEMA = 'db_name' and TABLE_NAME = 'tb_name';# 按碎片大小排序
SELECT t.TABLE_SCHEMA,t.TABLE_NAME,t.DATA_FREE,sys.FORMAT_BYTES(DATA_LENGTH+INDEX_LENGTH) as '总容量' ,sys.FORMAT_BYTES(DATA_FREE) as '碎片大小'
FROM information_schema.tables t
WHEREt.table_schema NOT IN ('mysql','information_schema','performance_schema','sys')
AND t.table_type = 'BASE TABLE' ORDER BY `DATA_FREE` DESC LIMIT 20# 查看碎片率大于0.3的表
select 
table_schema as '数据库',
TABLE_NAME as '表名',
sys.FORMAT_BYTES(DATA_LENGTH+INDEX_LENGTH) as '总容量' ,
sys.FORMAT_BYTES(DATA_FREE) as '碎片大小',
(DATA_FREE / (data_length + index_length)) AS '碎片率'
FROM information_schema.tables t
WHEREt.table_schema NOT IN ('mysql','information_schema','performance_schema','sys') AND t.table_type = 'BASE TABLE' and (DATA_FREE / (data_length + index_length)) > 0.3

以上三条 SQL 基本能覆盖日常所需场景,想要回收表碎片的话,可以按照不同场景执行相关 SQL 来查找,比如是想回收碎片比较多的表还是碎片率比较大的表。找到需要回收碎片的表后,下一步就是评估进行正式回收碎片操作了。

回收表碎片

对于 InnoDB 存储引擎的表,可以用 optimize table table_name; 或者 alter table table_name engine = innodb; 两种方式进行回收。

OPTIMIZE TABLE 对于 InnoDB 表来说,实际上会执行一个重建表的操作,这与 ALTER TABLE … FORCE 类似。这个过程会重新组织表的数据和索引,更新索引统计信息,并释放聚簇索引中未使用的空间。它可以在一定程度上减少表占用的空间,并提高访问表时的 IO 效率。OPTIMIZE TABLE 对于常规的和分区的 InnoDB 表使用 online DDL ,这减少了并发的 DML 操作的停机时间。OPTIMIZE TABLE 仅在操作的准备阶段和提交阶段短暂地获取独占的表锁,在准备阶段,元数据会被更新并且创建一个中间表,在提交阶段,将提交表元数据更改。

ALTER TABLE … ENGINE = InnoDB 命令实际上是将表的存储引擎重新设置为 InnoDB 。在这个过程中,MySQL 会对表进行重建,会回收掉未使用的空间。在 5.6 及以后的版本中,这个操作会使用 Online DDL ,减少对并发 DML 操作的影响。它通过创建一个临时文件,扫描表的数据页,并将操作记录在日志文件中,最后将临时文件替换原表的数据文件。此方法只适用于 InnoDB 引擎表。

总的来说,两者都可以用于整理 InnoDB 表的碎片,但是 OPTIMIZE TABLE 更侧重于专门的碎片整理和空间回收,还可以用于其他存储引擎。而 ALTER TABLE … ENGINE=InnoDB 主要是更改存储引擎属性时附带的一些空间优化。在实际使用中,可以根据具体情况选择合适的方式来回收 InnoDB 表的空间。

需要注意的一点是,尽管二者操作都是 Online DDL ,但回收操作还是尽量在业务低峰期执行,特别是大表,回收操作还是需要一段时间的。除此之外,要确保有足够的磁盘空间进行回收操作,因为执行期间会生成临时文件,进一步占用磁盘空间,执行完成后才会删除临时文件。例如你要对一个 200G 的表进行回收操作,预估能回收掉 50G 碎片,则要确保磁盘空间至少剩余 150G,一般建议剩余空间在表大小以上。如果你的磁盘剩余空间不足则无法完成回收操作。

总结:

本篇文章介绍了如何查看 InnoDB 表的碎片以及如何进行回收。生产环境中,建议定期巡检 MySQL 系统中的表碎片,并在业务低峰期执行回收操作。回收表碎片是一种良好的数据库维护实践,可以提高数据库查询性能,同时也可以提高存储效率和管理简便性。

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

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

相关文章

Lesson11---stack

Lesson11—stack cstack的介绍使用以及模拟实现 文章目录 Lesson11---stack前言一、stack成员函数1.stack2.empty3.size4. top5.push6.pop 二、stack相关题目1. 最小栈2.栈的压入、弹出序列 三、模拟实现总结 前言 stack的介绍和使用stack是一种容器适配器,专门用…

B+树(B树的改进)

目录 一、什么是B树? 二、B树的性质 1.B树被广泛作为数据库索引的索引结构 2.m个分支的结点有m个元素 3.每个元素对应子结点最大值 4.多级索引结构 5.叶子结点层包含所有元素 三、B树和B树的区别 四、B树的查找 1.顺序查找 2.随机查找 3.范围查找 一、什…

vue3完整Demo(数据绑定,数据显示,数据修改,数据提交)

需要引入的的依赖:jquery(用于异步请求) 一、数据显示的前端页面 条件查询数据并显示,下拉框使用的model双向绑定 二、js代码(list页面的数据请求) 后端传来的时间数据需要转换可以使用new Intl.DateTim…

Vue3 学习笔记(七)Vue3 语法-计算属性 computed详解

#1024程序员节|征文# 1、计算属性 computed 在 Vue.js 中,计算属性(computed properties)是一种特殊的响应式属性,它们根据依赖的响应式数据自动更新。计算属性非常适合用于当你需要根据现有数据派生出一些状态时。 (1)、基本用法…

LLM | 论文精读 | NeurIPS 2023 | SWIFTSAGE: 结合快思考与慢思考的生成智能体

论文标题:SWIFTSAGE: A Generative Agent with Fast and Slow Thinking for Complex Interactive Tasks 作者:Bill Yuchen Lin, Yicheng Fu, Karina Yang, Faeze Brahman, Shiyu Huang, Chandra Bhagavatula, Prithviraj Ammanabrolu, Yejin Choi, Xian…

【Vue3】第二篇

Vue3学习第二篇 01. 事件处理02. 事件传参03. 事件修饰符04. 数组变化侦测05. 计算属性06. class绑定07. style绑定08. 侦听器09. 表单输入绑定10. 模板引用 01. 事件处理 在vue当中的事件处理和html、css中的不一样,它单独做了处理。 注意:用法中只是用…

【Android】浅析OkHttp(1)

【Android】浅析OkHttp(1) OkHttp 是一个高效、轻量级的 HTTP 客户端库,主要用于 Android 和 Java 应用开发。它不仅支持同步和异步的 HTTP 请求,还支持许多高级功能,如连接池、透明的 GZIP 压缩、响应缓存、WebSocke…

JUC并发编程面试题总结

文章目录 1、创建线程的三种方式2、线程的状态3、线程的上下文切换4、run和start的区别5、sleep和wait区别6、虚假唤醒,精确唤醒7、两阶段终止模式8、多线程下的线程安全问题9、如何解决线程安全问题10、synchornized的原理11、锁升级的机制12、锁消除13、批量重偏向…

Unity编辑器制作多级下拉菜单

Unity编辑器下拉菜单 大家好,我是阿赵。   在Unity引擎里面编写工具插件,有时候会用到一些特殊的菜单形式,比如下拉选项。 通过下拉菜单,给用户选择不同的选项。   如果只是一层的下拉列表,可以用EditorGUILayout.…

Nginx upstream

什么是Nginx upstream? Nginx 模块一般分为三大类:handler、filter和upstream。 利用 handler、filter 这两个模块,可以使 Nginx 轻松完成任何单机工作。 upstream 模块将使 Nginx 跨越单机的限制,完成网络数据的接收、处理和转…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-23

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-23 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-23目录1. Advancements in Visual Language Models for Remote Sensing: Datasets, Capabilities, and Enhancement Techniques摘…

Zig 语言通用代码生成器:逻辑,冒烟测试版发布二

Zig 语言通用代码生成器:逻辑,冒烟测试版发布二 Zig 语言是一种新的系统编程语言,其生态位类同与 C,是前一段时间大热的 rust 语言的竞品。它某种意义上的确非常像 rust,尤其是在开发过程中无穷无尽抛错的过程&#x…

高等数学-宋浩版2.0-映射

映射:X,Y为非空集合,存在法则F,对X(原像)中每个元素X,按法则F,在Y中有唯一元素与之对应,F为x到Y(镜像)的映射。f:X->Y X原像,Y像,x定义域,Df,Rf &#x…

python之多任务爬虫——线程、进程、协程的介绍与使用(16)

文章目录 1、什么是多任务?1.1 进程和线程的概念1.2 多线程与多进程的区别1.3 并发和并行2、python中的全局解释器锁3、多线程执行机制4、python中实现多线程(threading模块)4.1 模块介绍4.2 模块的使用5、python实现多进行程(Multiprocessing模块)5.1 导入模块5.2 模块的…

Caffeine本地缓存框架

Caffeine本地缓存框架 hi,我是阿昌,今天记录一下Java最强本地缓存Caffeine 1、缓存介绍 缓存(Cache),在软件无处不在。从底层CPU多级缓存,再到客户页面缓存,和服务器数据缓存,导出都存在着缓存的身影&am…

HBuilder X 中Vue.js基础使用2(三)

一、条件渲染 1、条件判断 v-if : 表达式返回真值时才被渲染 v-else :表达式返回为假时不被渲染 2、 分支条件判断 v-else-if :使用v-if , v-else-if 和 v-else 来表示其他的条件分支 3、显示隐藏 v-show v-show true 把节点显示 …

PortQry下载安装使用教程(超详细),Windows测试UDP端口

《网络安全自学教程》 PortQry是微软官方提供的一款TCP/IP连接「排障工具」,用来「检查」TCP/UDP「端口状态」。 平时检查端口状态,最常用的是telnet,但它是基于TCP协议的,无法检测「UDP端口」,这篇文章教大家如何在W…

Axure随机验证码高级交互

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:字母数字随机验证码高级交互 主要内容:4位字母数字随机验证码生成、错误提示与State状态同步 应用场景:登录验证码、其他类…

面试宝典(五):用三个线程按顺序循环打印123三个数字,比如123123123

要使用三个线程按顺序循环打印123三个数字,势必要控制线程的执行顺序,可以使用java.util.concurrent包中的Semaphore类来控制线程的执行顺序。 代码示例 import java.util.concurrent.Semaphore;public class SequentialPrinting123 {private static Se…

leetcode:34. 在排序数组中查找元素的第一个和最后一个位置(python3解法)

#1024程序员节 | 征文# 难度:中等 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(lo…