不知道大家有没有遇到这样的一种情况,线上业务在MySQL表上做增删改查操作,随着时间的推移,表里面的数据越来越多,表数据文件越来越大,数据库占用的空间自然也逐渐增长
为了缩小磁盘上表数据文件占用的空间,我们在最大的一张业务表中用delete命令删除了一半儿的旧数据,删除之后,磁盘上表数据文件并没有缩小,即使删除整张表的数据,文件依然没有变小,这是为什么呢?
本文将详细的分析上述问题,并给出正确回收表空间的方法
前置说明
目前大部分MySQL数据库都是用的 InnoDB 引擎,所以如无特殊说明,文中的实例都是基于InnoDB引擎的
在MySQL配置中有个配置项叫 innodb_file_per_table
将它设置为1之后,
每个表的数据会单独存储在一个以 .ibd
为后缀的文件中
如果 innodb_file_per_table
没有开启的话,
表的数据是存储在系统的共享表空间,这样即使删除了表,共享表空间也不会释放这部分空间
所以,通常情况下,都是将 innodb_file_per_table
选项设置为 1, 同时为了能直观的看到表数据文件的大小变化,文中的实例也都是基于开启了 此选项来说明的
问题重现
新建一张表ta
,表的结构如下
mysql> show create table ta\G
*************************** 1. row *************************** Table: ta Create Table: CREATE TABLE `ta` ( `id` int(11) NOT NULL, `ia` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec)
使用下面的存储过程,向 ta
中批量插入数据
delimiter //
create procedure multinsert(in beg int,in cnt int)
begin
declare icnt