@llplmlyd
2023-04-18T16:00:14.000000Z
字数 594
阅读 187
数据库
使用delete删除数据的时候,MySQL并不会把数据文件真实删除,而只是将数据文件的标识位删除,也没有整理数据文件,因此不会彻底释放表空间。换句话说,每当我们从表中删除数据时,这段被删除数据的空间就会被留出来,如果又赶上某段时间内该表进行大量的delete操作,则这部分被删除数据的空间就会越来越大。当有新数据写入时,MySQL会再次利用这些被删除的区域,但也无法彻底占用。
mysql> show table status like "%employees%"\G;
...
Rows: 299335
Avg_row_length: 50
Data_length: 15220736
Max_data_length: 0
Index_length: 0
Data_free: 0
...
(1)碎片大小=数据总大小-实际表空间文件大小
(2)数据总大小=data_length+index_length=15220736
(3)实际表空间文件大小=rows*avg_rog_length=299335*50=14966750
(4)碎片大小=(15220736-14966750)/1024/1024=0.2M
前面两种方式会锁表 后面那种方式在执行过程中不缩锁表