MySQL表碎片整理
1 表碎片介绍
在InnoDB表中删除行的时候,这些行只是被标记为“已删除”,而不是真正从物理存储上进行删除,碎片的存在十分影响数据库的性能。
删除数据就会导致页(Page)中出现空白空间,大量随机的DELETE操作,必然会在数据文件中造成不连续的空白空间。而当插入数据时,这些空白空间则又会被利用起来,于是造成了数据的存储位置不连续。物理存储顺序与逻辑上的排序不同,这种就是数据碎片。
对于大量的UPDATE,也会造成文件碎片化,InnoDB的最小物理存储分配单位是页(Page),而UPDATE也可能导致页分裂(Page Split)。频繁的页分裂,页会变得稀疏,并且被不规则地填充,所以最终数据会有碎片。
影响:
(1)由于碎片空间是不连续的,导致这些空间不能充分被利用;
(2)数据库的磁盘I/O操作变成离散随机读写,加重了磁盘I/O的负担。
2 查看表碎片
碎片大小 = 表数据总大小 - 实际表空间大小
表大小查看示例:show table status like 't_meta_form' \G;
表数据总大小 = Data_length + Index_length = 594001920
实际表空间大小 = Rows * Avg_row_length = 577956231
(单位为字节byte)
碎片大小=(表数据总大小 - 实际表空间大小)/ 1024/1024 = 16045689/1024/1024 = 15.3MB
可以计算出当前表碎片大小为15.3MB。
3 清理表碎片
通过重建表清理表碎片
示例:
cosmic@zy01_meta17:14> alter table t_meta_form engine=innodb;
注:MySQL8.0支持在线重建表,但还是会有锁表动作,建议测试环境验证后,生产环境在业务空闲时期操作。生产环境可以按大小查询排名前20的表,针对增删改操作频繁的业务大表做针对性碎片清理。
MySQL表碎片整理
本文2024-09-23 01:12:58发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-144518.html