我的编程空间,编程开发者的网络收藏夹
学习永远不晚

mysql删除操作其实是假删除问题怎么解决

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

mysql删除操作其实是假删除问题怎么解决

本篇内容介绍了“mysql删除操作其实是假删除问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

mysql删除操作其实是假删除

在 InnoDB 中,你的 delete 操作,并不会真的把数据删除,mysql 实际上只是给删除的数据打了个标记,标记为删除,因此你使用 delete 删除表中的数据,表文件在磁盘上所占空间不会变小,我们这里暂且称之为假删除

我们可以通过一个例子来验证下

沿用前面文章中的例子吧,先创建一个存储过程,插入 10w 条数据,然后看下这 10w 条数据占了多大的空间。

CREATE TABLE `t` (  `id` int(11) NOT NULL,  `a` int(11) DEFAULT NULL,  `b` int(11) DEFAULT NULL,  PRIMARY KEY (`id`),  KEY `a` (`a`),  KEY `b` (`b`)) ENGINE=InnoDB;
#定义分割符号,mysql 默认分割符为分号;,这里定义为 //#分隔符的作用主要是告诉mysql遇到下一个 // 符号即执行上面这一整段sql语句delimiter // #创建一个存储过程,并命名为 testDatacreate procedure testData()  #下面这段就是表示循环往表里插入10w条数据begin  declare i int;  set i=1;  while(i<=100000)do    insert into t values(i, i, i);    set i=i+1;  end while;end //  #这里遇到//符号,即执行上面一整段sql语句 delimiter ; #恢复mysql分隔符为; call testData(); #调用存储过程
#下面这两条命令可以查看表文件所占空间大小mysql> use information_schema;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -A Database changedmysql> select concat(round(sum(DATA_LENGTH/1024/1024),2),'M') from tables where table_schema='test' AND table_name='t';+-------------------------------------------------+| concat(round(sum(DATA_LENGTH/1024/1024),2),'M') |+-------------------------------------------------+| 3.52M                                           |+-------------------------------------------------+1 row in set (0.04 sec)

可以看到 10w 条数据在 mysql 中占用了 3.52M 大小的空间,那么我们执行删除命令 delete from t,再看看呢。

#先删除表所有数据,再重新查看表文件大小mysql> delete from t;Query OK, 100000 rows affected (0.46 sec) mysql> use information_schema;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -A Database changedmysql> select concat(round(sum(DATA_LENGTH/1024/1024),2),'M') from tables where table_schema='test' AND table_name='t';+-------------------------------------------------+| concat(round(sum(DATA_LENGTH/1024/1024),2),'M') |+-------------------------------------------------+| 3.52M                                           |+-------------------------------------------------+1 row in set (0.00 sec)

从结果可以发现表数据被清空后,表所占空间大小并没有变化,这就验证了上面的结论,delete 操作并没有真正删除数据,表的空间并没有被释放。

这些被删除的记录行,只是被标记删除,是可以被复用的,下次有符合条件的记录是可以直接插入到这个被标记的位置的。

比如我们在 id 为 300-600 之间的记录中删除一条 id=500 的记录,这条记录就会被标记为删除,等下一次如果有一条 id=400 的记录要插入进来,那么就可以复用 id=500 被标记删除的位置,这种情况叫行记录复用

还有一种情况是数据页复用,就是指整个数据页都被标记删除了,于是这整个数据页都可以被复用了,和行记录复用不同的是,数据页复用对要插入的数据几乎没有条件限制。

还以上面那个插入为例,假如要插入的记录是 id=1000,那么就不能复用 id=500 这个位置了,但如果有一整个数据页可复用的话,那么无论 id 值为多少都可以被复用在这个页上。

这些被标记删除的记录,其实就是一个空洞,有种占着茅坑不拉屎的感觉,浪费空间不说,还会影响查询效率。

因为你要知道,mysql 在底层是以数据页为单位来存储和读取数据的,每次向磁盘读一次数据就是读一个数据页,然而每访问一个数据页就对应一次磁盘 IO 操作,磁盘 IO 相对内存访问速度是相当慢的。

所以你想想,如果一个表上存在大量的数据空洞,原本只需一个数据页就保存的数据,由于被很多空洞占用了空间,不得不需要增加其他的数据页来保存数据,相应的,mysql 在查询相同数据的时候,就不得不增加磁盘 IO 操作,从而影响查询速度。

其实不仅仅是删除操作会造成数据空洞,插入和更新同样也会造成空洞,这里就不细说了,你知道就行。

因此,一个数据表在经过大量频繁的增删改之后,难免会产生数据空洞,浪费空间并影响查询效率,通常在生产环境中会直接表现为原本很快的查询会变得越来越慢。

对于这种情况,我们通常可以使用下面这个命令就能解决数据空洞问题。

optimize table t

这个命令的原理就是重建表,就是建立一个临时表 B,然后把表 A(存在数据空洞的表) 中的所有数据查询出来,接着把数据全部重新插入到临时表 B 中,最后再用临时表 B 替换表 A 即可,这就是重建表的过程。

我们再来试验一下。

看看效果

mysql> optimize table t;+--------+----------+----------+-------------------------------------------------------------------+| Table  | Op       | Msg_type | Msg_text                                                          |+--------+----------+----------+-------------------------------------------------------------------+| test.t | optimize | note     | Table does not support optimize, doing recreate + analyze instead || test.t | optimize | status   | OK                                                                |+--------+----------+----------+-------------------------------------------------------------------+2 rows in set (0.39 sec) mysql> use information_schema;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -A Database changedmysql> select concat(round(sum(DATA_LENGTH/1024/1024),2),'M') from tables where table_schema='test' AND table_name='t';+-------------------------------------------------+| concat(round(sum(DATA_LENGTH/1024/1024),2),'M') |+-------------------------------------------------+| 0.02M                                           |+-------------------------------------------------+1 row in set (0.00 sec)

可以看到表文件大小已经变成 0.02M了,说明表空间被释放了,这个 0.02M 应该是定义表结构文件的大小了。

另外下面这个命令也可以实现重建表,可以达到跟上面一样的效果,而且推荐大家使用下面这个命令,大家可以试试。

alter table t engine=InnoDB

注意本文内容是基于 InnoDB 引擎,对于其他引擎可能存在一些差异。

“mysql删除操作其实是假删除问题怎么解决”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

mysql删除操作其实是假删除问题怎么解决

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

mysql删除操作其实是假删除问题怎么解决

本篇内容介绍了“mysql删除操作其实是假删除问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!mysql删除操作其实是假删除在 I
2023-07-06

mysql删除操作其实是假删除问题

目录mysql删除操作其实是假删除我们可以通过一个例子来验证下看看效果总结mysql删除操作其实是假删除在 InnoDB 中,你的 delete 操作,并不会真的把数据删除,mysql 实际上只是给删除的数据打了个标记,标记为删除,因此你
2023-04-12

mybatisplus的逻辑删除问题怎么解决

本文小编为大家详细介绍“mybatisplus的逻辑删除问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“mybatisplus的逻辑删除问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。myb
2023-07-05

windows文件删除常见问题怎么解决

这篇文章主要介绍“windows文件删除常见问题怎么解决”,在日常操作中,相信很多人在windows文件删除常见问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”windows文件删除常见问题怎么解决
2023-07-01

redis删除数据还存在问题怎么解决

如果使用Redis删除数据后数据仍然存在的问题,可能是因为Redis的持久化机制导致的。Redis有两种持久化方式,一种是RDB快照,一种是AOF日志。如果开启了持久化功能,可能是因为数据已经被持久化到磁盘中,导致删除操作无效。解决方法如
redis删除数据还存在问题怎么解决
2024-04-09

redis批量删除key值的问题怎么解决

这篇文章主要讲解了“redis批量删除key值的问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“redis批量删除key值的问题怎么解决”吧!遇到的问题:在开发过程中,会遇到要批量
2023-06-29

SQL未能删除约束drop constraint问题怎么解决

这篇“SQL未能删除约束drop constraint问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“SQL未能删
2023-06-30

java中怎么解决list集合做删除操作时的坑

本篇内容主要讲解“java中怎么解决list集合做删除操作时的坑”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java中怎么解决list集合做删除操作时的坑”吧!关于list集合做删除操作时的坑
2023-06-25

Linux文件后删除空间未释放问题怎么解决

小编今天带大家了解Linux文件后删除空间未释放问题怎么解决,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“Linux文件后删除空间未
2023-06-28

云服务器操作指南:手机上的文件夹删除问题解决方法

1.了解云服务器和手机文件夹删除问题在开始解决问题之前,我们先来了解一下云服务器和手机文件夹删除问题。云服务器是一种基于云计算技术的虚拟服务器,可以通过互联网进行远程访问和管理。它提供了强大的计算和存储能力,可以用于托管网站、应用程序和数据等。而手机文件夹删除问题是指在使用手机访问云服务器时,无法删除云服务器上的文件夹的情况。这可能是由于权限问题、网络连接问题或其他原因导致的。2.检查权限和网络连接首...
2023-10-27

windows你需要权限来执行此操作删除不了怎么解决

这篇文章主要介绍了windows你需要权限来执行此操作删除不了怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇windows你需要权限来执行此操作删除不了怎么解决文章都会有所收获,下面我们一起来看看吧。解
2023-07-02

linux中怎么解决文件已删除但空间不释放的问题

本篇内容主要讲解“linux中怎么解决文件已删除但空间不释放的问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux中怎么解决文件已删除但空间不释放的问题”吧!导读一般来说不会出现删除文件
2023-06-05

怎么用MyBatisPlus解决逻辑删除与唯一索引的兼容问题

这篇文章主要介绍“怎么用MyBatisPlus解决逻辑删除与唯一索引的兼容问题”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用MyBatisPlus解决逻辑删除与唯一索引的兼容问题”文章能帮助大
2023-07-06

亚马逊解决与删除服务器异常问题的方法是什么

检查服务器状态:如果您的服务器出现异常,例如访问量激增或服务器故障,您可以通过检查服务器状态来识别问题。这可以通过查看日志文件、错误消息或运行其他测试来实现。恢复服务器配置:如果服务器配置发生变化,例如删除了一些数据库或存储设备,您可以通过重新配置服务器配置来恢复服务器状态。更新操作系统和应用程序:如果服务器配置发生变化,例如删除了某个应用程序或更新了某个安全补丁,您可以通过更新操作系统和应用程序...
2023-10-27

怎么解决xp系统删除用户导致加密文件打不开的问题

本篇内容主要讲解“怎么解决xp系统删除用户导致加密文件打不开的问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决xp系统删除用户导致加密文件打不开的问题”吧!  1.以Administr
2023-06-14

MySQL中使用delete_at(时间戳)作为逻辑删除标记时如何使用MyBatis-Plus逻辑删除组件插入时间戳,以及如何解决自动填充失效的问题

背景 MySQL中使用delete_at(时间戳)作为逻辑删除标记 在业务中,使用逻辑删除是普遍做法,通常会使用一个名为deleted(0/1)的字段表示删除状态。 但是如果遇到有唯一约束,且可能反复删除和重新插入的表(如用户表,注销用户使
2023-08-30

编程热搜

目录