# 表碎片率过高的解决办法
#### 场景描述
在使用TaurusDB的过程中，经常会遇到表碎片率过高的问题。表碎片指的是在TaurusDB数据库中，表的数据和索引分散在不同的物理块中，这些物理块可能不连续，或者存在一些空闲空间，从而导致表的数据和索引在磁盘上的存储不是最优的。
这种现象主要是由于TaurusDB表的数据操作（比如删除、更新、插入等操作）引起的，会使得表中的数据行不断地被修改和移动，从而导致表中的数据片段变得不连续。
#### 影响及风险
- 表空间膨胀 表碎片率过高会导致数据库中存在大量未使用的空间，这些空间无法重复利用，从而浪费磁盘空间。
  
- 查询优化不佳 表碎片率过高会导致优化器无法正确及有效地利用索引，从而影响执行计划的选择，导致查询性能下降。
  
- SQL执行效率降低 表碎片率过高会导致数据库执行SQL时需要花费额外的时间进行I/O扫描及整理碎片，导致查询和更新操作变慢，响应时间变长。
  
 
#### 排查方法
**方法一：通过智能DBA功能实时查看实例磁盘空间使用情况，避免出现磁盘空间不足的问题。**
1. [登录TaurusDB管理控制台](https://console.huaweicloud.com/gaussdbformysql/#/management/list)。
2. 单击管理控制台左上角的![](https://support.huaweicloud.com/taurusdb_faq/figure/zh-cn_image_0000002671347251.png)，选择区域。
3. 在"实例管理"页面，选择目标实例，单击实例名称，进入实例概览页面。
4. 在左侧导航栏选择"智能DBA助手 \> 实时诊断"，进入概览页面。
5. 单击"容量预估"，从Top50库表空间统计中可以查看碎片空间及碎片率数据。
   图1Top50库表   
   ![](https://support.huaweicloud.com/taurusdb_faq/figure/zh-cn_image_0000002538916700.png "点击放大")
   
   
**方法二：通过命令方式查看碎片率数据。**
1. 使用以下命令对表进行分析，更新表的统计信息。
   ```
   ANALYZE TABLE table_name;
   ```
   
2. 使用以下命令可以查看表的详细信息。
   ```
   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回显信息   
   ![](https://support.huaweicloud.com/taurusdb_faq/figure/zh-cn_image_0000002541658706.png "点击放大") 
 
#### 原因分析
**原因1：DRS全量迁移阶段并行迁移导致**
DRS在全量迁移阶段，为了保证迁移性能和传输的稳定性，采用了行级并行的迁移方式。当源端数据紧凑情况下，通过DRS迁移到TaurusDB后，更高的碎片率可能会导致数据膨胀，使得磁盘空间使用远大于源端。
**原因2：大量删除操作后在表空间留下碎片**
当删除数据时，TaurusDB不会立即回收被删除数据占用的存储空间，而是仅做标记以供后续复用。如果新的数据未能及时填补这些空间，就会导致表空间膨胀，并形成大量碎片。
#### 解决方案
以下场景可能需要优化表碎片率：
- 数据库长时间运行。 长时间运行产生的插入、更新和删除等数据操作可能会产生表碎片。
  
- 大量数据变更 数据库大量的数据变更，可能会导致碎片产生。
  
- 数据库性能下降 当同样数据量级的查询，用户识别到了明显的性能下降，可能需要排查碎片率的影响。
  
- 磁盘空间不足 磁盘空间使用率过高的情况下，可以排查碎片空间的大小，通过整理碎片达到释放磁盘空间的效果。
  
针对表碎片率过高的问题，建议定期对频繁访问的表做碎片分析并清理碎片，进行表空间优化整理，从而缩小空间，优化性能。
执行如下命令对表进行分析：
```
OPTIMIZE TABLE table_name;
```
![](https://support.huaweicloud.com/taurusdb_faq/public_sys-resources/caution_3.0-zh-cn.png)
**OPTIMIZE TABLE**命令会有短暂锁表操作，整体执行时间与表大小有关。一般执行时间较长，所以进行表空间优化时建议避开业务高峰期，避免影响正常业务的进行。
#### 对比ANALYZE TABLE和OPTIMIZE TABLE
表1对比ANALYZE TABLE和OPTIMIZE TABLE 
| 对比项  | ANALYZE TABLE                                 | OPTIMIZE TABLE                          |
|:---|:---|:---|
| 含义   | 会更新表的统计信息，通常用于解决因表统计信息长时间未更新而导致SQL选择错误索引等问题。 | 不仅会更新统计信息，还会释放碎片空间，通常用于解决表中碎片空间过多的问题。   |
| 执行时间 | 秒级。                                           | 由表的数据量、实例规格、业务负载等综合决定，建议您在**业务低峰期**执行。 |
| 锁表时间  | 秒级内。                                           | 秒级内。                                   |
   
#### 常见问题
问：为什么删除了数据，空间占用没有变小？
答：TaurusDB对删除数据的场景进行了优化，被删除的数据空间默认不会立即释放，而是留作新写入数据使用。
如果您希望立即释放空间，建议在业务低峰期执行OPTIMIZE TABLE *tableName*。
