表碎片率过高的解决办法
场景描述
在使用TaurusDB的过程中,经常会遇到表碎片率过高的问题。表碎片指的是在TaurusDB数据库中,表的数据和索引分散在不同的物理块中,这些物理块可能不连续,或者存在一些空闲空间,从而导致表的数据和索引在磁盘上的存储不是最优的。
这种现象主要是由于TaurusDB表的数据操作(比如删除、更新、插入等操作)引起的,会使得表中的数据行不断地被修改和移动,从而导致表中的数据片段变得不连续。
影响及风险
排查方法
方法一:通过智能DBA功能实时查看实例磁盘空间使用情况,避免出现磁盘空间不足的问题。
- 登录TaurusDB管理控制台。
- 单击管理控制台左上角的
,选择区域和项目。 - 在“实例管理”页面,选择目标实例,单击实例名称,进入实例概览页面。
- 在左侧导航栏选择“智能DBA助手 > 实时诊断”,进入概览页面。
- 单击“容量预估”,从Top50库表空间统计中可以查看碎片空间及碎片率数据。
图1 Top50库表
方法二:通过命令方式查看碎片率数据。
- 使用以下命令对表进行分析,更新表的统计信息。
ANALYZE TABLE table_name; - 使用以下命令可以查看表的详细信息。
SELECT table_name, data_length, data_free FROM information_schema.tables WHERE table_schema = 'database_name' AND table_name = 'table_name';- table_name:表名称。
- data_length:表存储的数据大小(单位:字节)。
- data_free:表中已分配但未被使用的空间,即表碎片空间(单位:字节)。
通常,可以通过计算data_free占data_length的比例来初步评估碎片率,以估计碎片化程度。
图2 回显信息
原因分析
原因1:DRS全量迁移阶段并行迁移导致
DRS在全量迁移阶段,为了保证迁移性能和传输的稳定性,采用了行级并行的迁移方式。当源端数据紧凑情况下,通过DRS迁移到TaurusDB后,更高的碎片率可能会导致数据膨胀,使得磁盘空间使用远大于源端。
原因2:大量删除操作后在表空间留下碎片
当删除数据时,TaurusDB不会立即回收被删除数据占用的存储空间,而是仅做标记以供后续复用。如果新的数据未能及时填补这些空间,就会导致表空间膨胀,并形成大量碎片。
解决方案
以下场景可能需要优化表碎片率:
- 数据库长时间运行。
- 大量数据变更
- 数据库性能下降
- 磁盘空间不足
针对表碎片率过高的问题,建议定期对频繁访问的表做碎片分析并清理碎片,进行表空间优化整理,从而缩小空间,优化性能。
执行如下命令对表进行分析:
OPTIMIZE TABLE table_name;
OPTIMIZE TABLE命令会有短暂锁表操作,整体执行时间与表大小有关。一般执行时间较长,所以进行表空间优化时建议避开业务高峰期,避免影响正常业务的进行。
对比ANALYZE TABLE和OPTIMIZE TABLE
|
对比项 |
ANALYZE TABLE |
OPTIMIZE TABLE |
|---|---|---|
|
含义 |
会更新表的统计信息,通常用于解决因表统计信息长时间未更新而导致SQL选择错误索引等问题。 |
不仅会更新统计信息,还会释放碎片空间,通常用于解决表中碎片空间过多的问题。 |
|
执行时间 |
秒级。 |
由表的数据量、实例规格、业务负载等综合决定,建议您在业务低峰期执行。 |
|
锁表时间 |
秒级内。 |
秒级内。 |
常见问题
问:为什么删除了数据,空间占用没有变小?
答:TaurusDB对删除数据的场景进行了优化,被删除的数据空间默认不会立即释放,而是留作新写入数据使用。
如果您希望立即释放空间,建议在业务低峰期执行OPTIMIZE TABLE tableName。