mysql数据库的空间释放

MySQL 中也存在表空间的概念。通常情况下,MySQL 表空间是由 InnoDB 存储引擎实现的,称为“表空间文件”或“共享表空间”。

表空间在数据库中的作用并不只是存储数据,还可以提高查询效率、进行备份与恢复、优化索引操作等。在 MySQL 中,管理员可以通过设置表空间的参数来控制表空间的大小、位置、自动扩展等属性。

所以,有时候,我们删除了表中的大量数据记录后,会发现,数据库占用的磁盘空间还是没有降下来,这有可能产生较大影响(尤其是像云数据库这种占用空间需要收费,空间不足时直接锁库的)。

其实,在使用delete之类的方法删除表数据后,要彻底释放掉空间,我们其实是需要重新建表的。

最基本的方法就是将原表结构导出,重命名,再用导出的表结构重建表,接收用insert把原表中的数据导到新表,最后删除重命名后的原表。
上面这个操作好理解,但是步骤繁琐,也容易出现失误。所以,我们可以使用下面的DDL(数据定义语言)命令来完成:
alter table 原表名 engine=InnoDB; -- 从5.6版本开始,此命令已被优化为online DDL。
执行完后,mysql就会自动完成重建表,导数据等,数据库占用空间也就会正常降下来了。

扩展1:
online DDL的流程是这样的:
1、扫描原表中的所有数据,生成一颗新的B+树,将其存入一个临时文件。
2、存入临时文件的过程中,如果有对原表的增删改操作,将这些操作存入一个日志文件。
3、临时文件生成完以后,将日志中的操作重放到临时文件中,这样就得到了一个与原表一样的数据文件。
4、用临时文件替换原表的数据。
由于日志文件的存在,在重建表的过程中,原表仍然是可以操作的,所以可以称之为online DDL。

扩展2:
DLL(数据定义语言)常用的几个命令关键字:
CREATE:创建一个新的数据库对象,如表、视图、索引等。
ALTER:修改一个已存在的数据库对象的结构,如表字段、索引等。
DROP:删除一个数据库对象,如表、视图等。
TRUNCATE:快速删除表中的所有数据。

猜你喜欢

转载自blog.csdn.net/babdpfi/article/details/130038189