MySQL data_free 参数

定义

该参数表示 被定义为空间碎片,指数据库中 空闲没有被使用 的空间 。

MySQL 在删除 数据的 时候,数据没有被 真正的删除,而是将 删除的数据 进行 标记,最终由 purge 线程来决定清除。同时,删除数据后的 文件大小 也不会改变,此时,删除数据后的空间空间就会行程 空间碎片,等待 后期数据 插入的时候 空间继续被 重用。data_fee 就是代表 '空闲' 的参数。

条件

当数据库进行 大量 delete 操作 的情况时,会出现 大量的 '空闲' 空间,此时 data_free 的值 就会升高。

如果 数据库 进行大量的数据操作,并且伴随着 大量临时表 的产生,临时表没有及时收回 也会产生大量的临时碎片

总结:记一次Mysql表碎片清理_datafree多大需要处理_小魏的博客的博客-CSDN博客

实验

delete

查看表初始的状态,发现 data_free 为 0

mysql> show table status from frag_test\G;
*************************** 1. row ***************************
           Name: frag_test
         Engine: MyISAM
        Version: 10
     Row_format: Dynamic
           Rows: 2
 Avg_row_length: 20
    Data_length: 40
Max_data_length: 281474976710655
   Index_length: 1024
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2023-11-07 11:44:33
    Update_time: 2023-11-07 11:44:33
     Check_time: NULL
      Collation: utf8mb4_general_ci
       Checksum: NULL
 Create_options:
        Comment:
1 row in set (0.00 sec)

delete 删除数据

mysql>  delete from frag_test where c1 = 'this is row 1';
Query OK, 1 row affected (0.01 sec)


mysql>
mysql>
mysql>
mysql> show table status from frag_test\G;
*************************** 1. row ***************************
           Name: frag_test
         Engine: MyISAM
        Version: 10
     Row_format: Dynamic
           Rows: 1
 Avg_row_length: 20
    Data_length: 40
Max_data_length: 281474976710655
   Index_length: 1024
      Data_free: 20
 Auto_increment: NULL
    Create_time: 2023-11-07 11:44:33
    Update_time: 2023-11-07 11:44:43
     Check_time: NULL
      Collation: utf8mb4_general_ci
       Checksum: NULL
 Create_options:
        Comment:
1 row in set (0.00 sec)

此后 data_free 的值 变为 20 ,说明 删除数据 造成 空闲的空间。

ibdata 共享空间

MySQL data_free 参数_第1张图片

此表空间中所有表的data_Free将报告相同的数字,即整个表空间中空闲页面的空间量,而不仅仅是一个表.

表空间文件一共才136G,下面的几个表的data_free都是120多G:
mysql> select table_schema,table_name,data_free,data_length,index_length FROM  information_schema.TABLES where data_free !=0;
+--------------+------------------------------+--------------+-------------+--------------+
| table_schema | table_name                   | data_free    | data_length | index_length |
+--------------+------------------------------+--------------+-------------+--------------+
| eip_partner  | TASK_AUDIT_PARAM             | 124129378304 |       16384 |            0 | 
| eip_partner  | TASK_AUDIT_TOTAL             | 124129378304 |       16384 |            0 | 
| eip_partner  | TASK_PENDING_LOG             | 124129378304 |       16384 |            0 | 
| eip_partner  | TASK_READING_LOG             | 124129378304 |       16384 |            0 | 

innodb

data_free :碎片大小(其实就是delete数据导致索引空间没释放)

innodb 引擎在一定程度上会 避免 出现 空间碎片

mysql> show table status from frag_test\G;
*************************** 1. row ***************************
           Name: frag_test
         Engine: InnoDB
        Version: 10
     Row_format: Dynamic
           Rows: 3
 Avg_row_length: 5461
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2023-11-07 11:42:36
    Update_time: 2023-11-07 11:43:24
     Check_time: NULL
      Collation: utf8mb4_general_ci
       Checksum: NULL
 Create_options:
        Comment:
1 row in set (0.01 sec)

删除 数据 查看

mysql>  delete from frag_test where c1 = 'this is row 2';
Query OK, 1 row affected (0.01 sec)


mysql>
mysql>
mysql>
mysql>
mysql> show table status from frag_test\G;
*************************** 1. row ***************************
           Name: frag_test
         Engine: InnoDB
        Version: 10
     Row_format: Dynamic
           Rows: 2
 Avg_row_length: 8192
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2023-11-07 11:42:36
    Update_time: 2023-11-07 11:44:00
     Check_time: NULL
      Collation: utf8mb4_general_ci
       Checksum: NULL
 Create_options:
        Comment:
1 row in set (0.00 sec)

发现 data_free 依然 为 0

原因

该结构下删除了大量的行,此时索引会重组并且会释放相应的空间因此不必优化

注意

碎片的产生及消除都是随机的。碎片会在表格中留下明显的空白,虽然空白空间没有数据,扫描的话也会对空白区域进行扫描,

根据情况 对 空间碎片进行 合并,opimize 合并的时候会锁表,所以不宜经常在程序中调用

innodb 引擎的表改进了 空间碎片,不会产生大量的空间碎片。

MySQL8.x 版本当中,对碎片优化也作出了很大的改进,不会产生大量的 空间碎片

你可能感兴趣的:(mysql,adb,android)