定义
该参数表示 被定义为空间碎片,指数据库中 空闲没有被使用 的空间 。
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 共享空间
此表空间中所有表的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 版本当中,对碎片优化也作出了很大的改进,不会产生大量的 空间碎片