最近有个上位机获取下位机上报数据的项目,由于上报频率比较频繁且数据量大,导致数据增长过快,磁盘占用多。

为了节约成本,定期进行数据备份,并通过delete删除表记录。

明明已经执行了delete,可表文件的大小却没减小,令人费解

项目中使用Mysql作为数据库,对于表来说,一般为表结构和表数据。表结构占用空间都是比较小的,一般都是表数据占用的空间。

当我们使用 delete删除数据时,确实删除了表中的数据记录,但查看表文件大小却没什么变化。

Mysql数据结构

凡是使用过mysql,对B+树肯定是有所耳闻的,MySQL InnoDB 中采用了 B+ 树作为存储数据的结构,也就是常说的索引组织表,并且数据时按照页来存储的。因此在删除数据时,会有两种情况:

  • 删除数据页中的某些记录

  • 删除整个数据页的内容

表文件大小未更改和mysql设计有关

比如想要删除 R4 这条记录:

InnoDB 直接将 R4 这条记录标记为删除,称为可复用的位置。如果之后要插入 ID 在 300 到 700 间的记录时,就会复用该位置。由此可见,磁盘文件的大小并不会减少。

通用删除整页数据也将记录标记删除,数据就复用用该位置,与删除默写记录不同的是,删除整页记录,当后来插入的数据不在原来的范围时,都可以复用位置,而如果只是删除默写记录,是需要插入数据符合删除记录位置的时候才能复用。

因此,无论是数据行的删除还是数据页的删除,都是将其标记为删除的状态,用于复用,所以文件并不会减小。

那怎么才能让表大小变小

DELETE只是将数据标识位删除,并没有整理数据文件,当插入新数据后,会再次使用这些被置为删除标识的记录空间,可以使用OPTIMIZE TABLE来回收未使用的空间,并整理数据文件的碎片。

OPTIMIZE TABLE 表名;

注意:OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用。

另外,也可以执行通过ALTER TABLE重建表

ALTER TABLE 表名 ENGINE=INNODB

有人会问OPTIMIZE TABLE和ALTER TABLE有什么区别?

alter table t engine = InnoDB(也就是recreate),而optimize table t 等于recreate+analyze

Online DDL

最后,再说一下Online DDL,dba的日常工作肯定有一项是ddl变更,ddl变更会锁表,这个可以说是dba心中永远的痛,特别是执行ddl变更,导致库上大量线程处于“Waiting for meta data lock”状态的时候。因此在 5.6 版本后引入了 Online DDL。

Online DDL推出以前,执行ddl主要有两种方式copy方式和inplace方式,inplace方式又称为(fast index creation)。相对于copy方式,inplace方式不拷贝数据,因此较快。但是这种方式仅支持添加、删除索引两种方式,而且与copy方式一样需要全程锁表,实用性不是很强。Online方式与前两种方式相比,不仅可以读,还可以支持写操作。

执行online DDL语句的时候,使用ALGORITHM和LOCK关键字,这两个关键字在我们的DDL语句的最后面,用逗号隔开即可。示例如下:

ALTER TABLE tbl_name ADD COLUMN col_name col_type, ALGORITHM=INPLACE, LOCK=NONE;

ALGORITHM选项

  • INPLACE:替换:直接在原表上面执行DDL的操作。

  • COPY:复制:使用一种临时表的方式,克隆出一个临时表,在临时表上执行DDL,然后再把数据导入到临时表中,在重命名等。这期间需要多出一倍的磁盘空间来支撑这样的 操作。执行期间,表不允许DML的操作。

  • DEFAULT:默认方式,有MySQL自己选择,优先使用INPLACE的方式。

LOCK选项

  • SHARE:共享锁,执行DDL的表可以读,但是不可以写。

  • NONE:没有任何限制,执行DDL的表可读可写。

  • EXCLUSIVE:排它锁,执行DDL的表不可以读,也不可以写。

  • DEFAULT:默认值,也就是在DDL语句中不指定LOCK子句的时候使用的默认值。如果指定LOCK的值为DEFAULT,那就是交给MySQL子句去觉得锁还是不锁表。不建议使用,如果你确定你的DDL语句不会锁表,你可以不指定lock或者指定它的值为default,否则建议指定它的锁类型。

执行DDL操作时,ALGORITHM选项可以不指定,这时候MySQL按照INSTANT、INPLACE、COPY的顺序自动选择合适的模式。也可以指定ALGORITHM=DEFAULT,也是同样的效果。如果指定了ALGORITHM选项,但不支持的话,会直接报错。

OPTIMIZE TABLE 和 ALTER TABLE 表名 ENGINE=INNODB都支持Oline DDL,但依旧建议在业务访问量低的时候使用

总结

delete 删除数据时,其实对应的数据行并不是真正的删除,仅仅是将其标记成可复用的状态,所以表空间不会变小。

可以重建表的方式,快速将delete数据后的表变小(OPTIMIZE TABLE 或ALTER TABLE),在 5.6 版本后,创建表已经支持 Online 的操作,但最好是在业务低峰时使用

为什么delete表数据,磁盘空间却还是被占用相关推荐

  1. MySQL 的几种碎片整理方案总结(解决delete大量数据后空间不释放的问题)

    MySQL 的几种碎片整理方案总结(解决delete大量数据后空间不释放的问题) 1.背景知识 1.1 为什么会有碎片 MySQL 中 insert 与 update 都可能导致页分裂,这样就存在碎片 ...

  2. 面试官问:数据库 delete 表数据,磁盘空间还是被一直占用,为什么?

    以下文章来源方志朋的博客,回复"666"获面试宝典 最近有个上位机获取下位机上报数据的项目,由于上报频率比较频繁且数据量大,导致数据增长过快,磁盘占用多. 为了节约成本,定期进行数 ...

  3. 表数据都删了一半,可我的表文件咋还是那么大

    本文分享自华为云社区<为什么表数据删掉一半,表文件大小不变?>,作者: JavaEdge. 由于DB占用空间太大,我删除了大表的一半数据,可为啥这表文件的大小没变? 数据库表的空间回收到底 ...

  4. Doris之磁盘空间管理(重点)

    Doris之磁盘空间管理(重点) 磁盘存储空间有关的系统参数和处理策略. Doris 的数据磁盘空间如果不加以控制,会因磁盘写满而导致进程挂掉.因此我们监测磁盘的使用率和剩余空间,通过设置不同的警戒水 ...

  5. lvm 扩展根目录_转://如何增加linux根目录的磁盘空间(基于LVM)?

    问题引出: 在测试过程中替换so文件,报磁盘空间不足的错误. ▲问题分析: 由于当时系统部署架构的考虑,把软件和数据库部署在了同一台机器上,并且给了30G的磁盘空间.系统上占用磁盘空间的有2部分,一是 ...

  6. linux增加/根目录的磁盘空间(基于LVM)

    linux增加/根目录的磁盘空间(基于LVM) 问题引出: 在测试过程中替换so文件,报磁盘空间不足的错误 [root@UF2 ~]# df -h Filesystem            Size ...

  7. Linux df -h 显示磁盘空间满,但实际未占用满——问题分析

    问题现象 工作中遇到一个问题,在 TX2 系统上,告警提示磁盘空间不够,如图所示 wohu@wohu:/$ df -h Filesystem Size Used Avail Use% Mounted ...

  8. centos一键清理磁盘空间_如何清理 Docker 占用的磁盘空间

    Docker 很占用空间,每当我们运行容器.拉取镜像.部署应用.构建自己的镜像时,我们的磁盘空间会被大量占用. 如果你也被这个问题所困扰,咱们就一起看一下 Docker 是如何使用磁盘空间的,以及如何 ...

  9. 4T硬盘剩余很多提示“No space left on device“磁盘空间不足

    在linux中,硬盘有两个概念,就是block和inode block:用于存放实际数据 ,实际占用空间用 df -h 查看 inode:存放文件属性 ,实际占用的节点用 df -i 查看 只要这两个 ...

最新文章

  1. 说一下你对多态的理解?_掌握了多态的特性,写英雄联盟的代码更少啦!
  2. 微型计算机原理 考试试题,微机原理期末考试试卷(有答案)
  3. Linux 0.11进程运行轨迹的跟踪,进程运行轨迹的跟踪与统计
  4. Linux文本处理及用户组管理命令练习
  5. 带你理解Spring AOP
  6. c++11之std::move()
  7. Linux redis故障,linux – Redis Stall故障排除
  8. IT行业趋势前沿:SOA和开源
  9. Lockdoor Framework:一套自带大量网络安全资源的渗透测试框架
  10. zookeeper的集群配置
  11. java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this a
  12. percona 5.7.11root初始密码设置
  13. 彻底拿下QSPI双闪存W25Q256| STM32H750| QSPI 双FLASH |cubeIDE |下载算法(一)
  14. Java-简易加法计算器代码优化
  15. 为什么要使用NAS存储设备呢?
  16. 沧海一声笑计算机版本,各个版本的《沧海一声笑》,古韵十足
  17. c++ lamber表达式
  18. Python键盘输入
  19. python绿色版_mPython最新下载_mPython绿色版 - 软件帝
  20. 分众传媒预计今年第一季度净利润同比下降65%至75%

热门文章

  1. 同时起两个mysql 起不了_到底是谁!让你在冬天的早晨起不了床?
  2. 常用的Linux服务器各项性能指标查看方法!
  3. C语言实现长整数连加,二个超长正整数的相加
  4. 【Java】5大排序算法总结(插入排序+希尔排序+选择排序+堆排序+冒泡排序)
  5. 【C语言】宏offsetof的模拟实现 (计算结构体中某变量相对于首地址的偏移)
  6. 树链剖分 ---- 2021杭电多校 1002 I love tree[详解]
  7. 洛谷 P4463 [集训队互测 2012] calc(拉格朗日插值优化DP)
  8. Build-dep linux 知乎,删除通过apt-get build-dep安装的软件包
  9. python生成一个窗口_PyQt5创建一个新窗口的实例
  10. 自动化测试框架cucumber_BDD测试框架之Cucumber使用入门