前言:
在 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(