MySQL表空间碎片
一、起因
在测试环境清空了某一个数据量较大的MySQL 表,但发现,其仍占据着存储空间。
心生疑问,故搜索了一番,在此简单做个整理。
二、出现碎片的原因
- 在InnoDB 中,删除一些行,这些行只是被标记为“已删除”,而不是真的从索引中物理删除了,因而空间也没有真的被释放回收,这些可以称为是空白空间
- 当执行插入操作时,MySQL 会尝试使用空白空间,但如果某个空白空间一直没有被大小合适的数据占用,仍然无法将其彻底占用,就形成了碎片
- 频繁修改了含有可变长度列的表(如:含有VARCHAR、BLOB 或TEXT 列的表),改短一些的时候就会出现非常小的空白空间,改长的话就有可能会因为空间不足导致把数据行的一些数据迁移到其他地方去
举个例子,假设一条记录二十个字节。
将两万条记录删到只剩一行,列表中有用的内容将只占二十字节。
如果没有及时插入,MySQL在 读取时会仍然将其视同于一个容量为四十万字节的列表进行处理,但实际上除了这二十字节以外,其它空间都被白白浪费了。
三、清理碎片的好处
当MySQL 对数据进行扫描时,它扫描的对象实际是表的容量需求上限,也就是表的数据实际占用空间 + 空白空间。
定期进行表空间整理,消除碎片可以
- 减少表数据与表索引的物理空间,降低磁盘空间使用率
- 降低访问表时的IO,提高MySQL 性能
举个例子,一个公司有10 个员工,10 个座位,被开除了7 个员工,但这些座位还是保留的。
碎片整理就像,让剩下的3个员工都靠边坐,然后把剩下的7 个座位给砸掉,这样就能释放出空间了。
四、检查表空间碎片
使用下面的命令检查数据库各数据表的空间使用情况:
show table status from db_name
查询结果如下:
其中Date_free 代表的就是空白空间,即碎片。当Date_free 大于0 时就表示对于的数据表存在碎片。
五、清理碎片
5.1 OPTIMIZE TABLE table_name
使用下面的命令进行碎片的清理:
optimize table 表名
- 支持的表类型:INNODB、MYISAM、ARCHIVE、NDB。
- 会重组表数据和索引的物理页,对于减少所占空间和在访问表时优化IO有效果。
- 在OPTIMIZE TABLE 运行过程中,MySQL 会锁定表,数据量越大,耗费的时间也越长。
- 并不是所有表都需要进行碎片整理,一般只需要对包含可变长度的文本数据类型的表进行整理即可。
- MySQL 官方建议不要经常(每小时或每天)进行碎片整理,一般根据实际情况,只需要每周或者每月整理一次即可。
- 只适用于独立表空间。
独立表空间:就是采用和MyISAM 相同的方式,每个表拥有一个独立的数据文件( .idb )。
- 每个表都有自已独立的表空间。
- 每个表的数据和索引都会存在自已的表空间中。
- 可以实现单表在不同的数据库中移动(将一个库的表移动到另一个库里,可以正常使用)。
- drop table 自动回收表空间,删除大量数据后可以通过alter table XX engine = innodb; 回收空间
optimize table 的操作,在MySQL5.5 和5.6 中,实际上执行的过程是,首先创建一张新的临时表,把旧表锁住,禁止插入删除只允许读写,接着把数据不断从旧表拷贝到新临时表,拷贝完成后,进行瞬间rename 操作,再删除旧表。
5.2 ALTER TABLE table_name ENGINE= INNODB
使用下面的命令进行碎片的清理:
ALTER TABLE table_name ENGINE= INNODB
- 实际执行的是一个空的 ALTER 命令,但是这个命令也会起到优化的作用,它会重建整个表,删掉未使用的空白空间。
- 会重新整理在聚簇索引上的数据和索引。
5.3 是用OPTIMIZE TABLE 还是ALTER TABLE xxxx ENGINE= INNODB 好?
其实对于InnoDB 引擎,ALTER TABLE xxxx ENGINE= INNODB 是执行了一个空的ALTER TABLE操作。
而OPTIMIZE TABLE 等价于ALTER TABLE … FORCE。
在有些情况下,OPTIMIZE TABLE 还是ALTER TABLE xxxx ENGINE= INNODB 基本上是一样的。
但是在有些情况下,ALTER TABLE xxxx ENGINE= INNODB 更好。
例如old_alter_table 系统变量没有启用等等。
另外对于MyISAM 类型表,使用ALTER TABLE xxxx ENGINE= INNODB 是明显要优于OPTIMIZE TABLE 这种方法的。
5.4 使用Navicat 单独清理某个表空间碎片
选择具体的数据表,鼠标右击后选择【维护 -> 优化表】即可,其效果与OPTIMIZE TABLE 大抵相同。
好了,本文到此结束。
我是陈冰安,Java 工程师,时不时也会整一整Linux 。
欢迎关注我的公众号【暗星涌动】,愿与你一同进步。
MySQL表空间碎片相关推荐
- MySQL表空间碎片整理
MySQL可以使用alter table tn engine=innodb语句进行表空间碎片整理.而页内记录并不是物理有序的,并且删除记录后,被删除的记录放到页内free链表,可能会产生很多空洞.al ...
- 清除mysql数据碎片_MySQL 清除表空间碎片方法总结
mysql数据库会生成空间碎片了,这些空间碎片对于我们来讲影响不大但如果空间碎片多了会导致mysql查询缓存了,下面一起来看MySQL 清除表空间碎片方法吧,具体的如下所示. 碎片产生的原因 (1)表 ...
- MySQL表空间简介
本文主要介绍一下MySQL中的几种表空间概念及相关操作. 基础材料: CentOS7.5 MySQL 5.7.24 ######################################### ...
- mysql 表空间监控shell_一种通过zabbix监控mysql表空间的方法
一种通过zabbix监控mysql表空间的方法[ 技术领域: ][0001]本发明涉及计算机自动化运维与监控领域,具体地说是一种通过ZABBIX监控MYSQL表空间的方法.[ 背景技术: ][0002 ...
- oracle 表空间 碎片,Oracle表空间碎片整理
作为影响数据库性能的一个因素,数据库表空间碎片,应当引起DBA的重视,及时发现并整理碎片是DBA基本维护内容,以提高数据库性能. Oracle数据库表空间.段.区.块简述 表空间(tablesapce ...
- Oracle表空间碎片查询以及整理
一.查看表空间碎片的方法 查看fsfi值 /* Formatted on 2017/9/21 13:42:29 (QP5 v5.240.12305.39476) */ select a.tablesp ...
- mysql 表空间收缩_mysql表碎片清理和表空间收缩
mysql表碎片清理和表空间收缩(即清理碎片后report_site_day.ibd文件磁盘空间减小,该方案基于独立表空间存储方式) OPTIMIZETABLE [tablename],当然这种方式只 ...
- mysql怎么把值更新成space,MySQL表的碎片整理和空间回收小结
MySQL表碎片化(Table Fragmentation)的原因 关于MySQL中表碎片化(Table Fragmentation)产生的原因,简单总结一下,MySQL Engine不同,碎片化的原 ...
- mysql清除表空间导入_MySQL 清除表空间碎片
碎片产生的原因 (1)表的存储会出现碎片化,每当删除了一行内容,该段空间就会变为空白.被留空,而在一段时间内的大量删除操作,会使这种留空的空间变得比存储列表内容所使用的空间更大; (2)当执行插入操作 ...
- mysql表空间过大_详解MySQL表空间以及ibdata1文件过大问题
ibdata1文件过大 原因分析 ibdata1是一个用来构建innodb系统表空间的文件,关于系统表空间详细介绍参考MySQL官网文档 上面是一个数据库的ibdata1文件,达到了780多G,而且还 ...
最新文章
- 如何将c语言改写成汇编语言,如何把汇编语言转换成C语言
- TCMalloc:线程缓存的Malloc
- js 判断一个元素是否存在
- Table布局及其它布局
- 数组分割问题——另一种方法
- JDBC Druid式link
- 【渝粤教育】国家开放大学2018年春季 0077-21T古代汉语专题 参考试题
- 一台服务器装两个sql server 如何访问吗_服务器多网卡多路由策略
- Ubuntu扩展触摸屏触控错位修复
- 20年研发安全积累,5大研发安全能力让软件“天生安全”
- 试试这个AI实验:把2D图像转换成3D
- NIPS2019 | 2019NIPS论文 | NeurIPS2019最新更新论文~持续更新| NIPS2019百度云下载
- 电动汽车仿真系列-基于动态规划的混合动力汽车能量管理
- Delphi语言基础
- 计算机图形学笔记(六)
- day3.python基础中下
- differentiable rendering可微分渲染
- 开发者,别让自己孤独
- android游戏开发教程之基本概念
- 基于MATLAB APP Designer 和 Python 的音视频剪辑