数据库
首页 > 数据库> > mysql crud造成数据空洞的原因

mysql crud造成数据空洞的原因

作者:互联网

mysql数据空洞

解决方案

alter table A engine=InnoDB 重建表空间,释放空洞的空间,缩容。
如果要收缩一个表,只是 delete 掉表里面不用的数据的话,表文件的大小是不会变的,你还要通过 alter table 命令重建表,才能达到表文件变小的目的。

MySQL 5.6 之前在这里插入图片描述
要求在整个 DDL 过程中,表 A 中不能有更新。也就是说,这个 DDL 不是 Online 的。 如果在这个过程中,有新的数据要写入到表 A 的话,就会造成数据丢失。
MySQL 5.6 版本开始引入的 Online DDL
引入了 Online DDL 之后,重建表的流程:

Online 和 inplace区别

在5.6之前:我们把表 A 中的数据导出来的存放位置叫作 tmp_table。这是一个临时表,是在 server 层创建的。
MySQL 5.6 版本开始引入的 Online DDL之后:根据表 A 重建出来的数据是放在“tmp_file”里的,这个临时文件是 InnoDB 在内部创建出来的。整个 DDL 过程都在 InnoDB 内部完成。对于 server 层来说,没有把数据挪动到临时表,是一个“原地”操作,这就是“inplace”名称的来源。对于server层来说,它是没有生成任何临时文件的,所以叫inplace 它都是在innodb层做的。
两者的区别:如果说这两个逻辑之间的关系是什么的话,可以概括为:DDL 过程如果是 Online 的,就一定是 inplace 的;反过来未必,也就是说 inplace 的 DDL,有可能不是 Online 的。截止到 MySQL 8.0,添加全文索引(FULLTEXT index)和空间索引 (SPATIAL index) 就属于这种情况。
怎么判断是不是相对 Server 层没有新建临时表
一个最直观的判断方法是看命令执行后影响的行数,没有新建临时表的话新建的行数是0。

alter table t engine=innodb,ALGORITHM=inplace; //原地
alter table t engine=innodb,ALGORITHM=copy;//拷贝  
与inplace在引擎层创建tmp文件不同,copy需要在server层建临时表

标签:table,mysql,DDL,crud,inplace,空洞,Online,临时文件,数据
来源: https://blog.csdn.net/qq_29066533/article/details/113532109