请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

delete是物理删除么?

这两天看mvcc,大部分网上的说法,都是说数据行有三个隐藏字段,其中有一个是标记数据是否删除的字段,用来实现事务的隔离。难道说mysql在执行delete语句的时候,只是标记了这个删除字段么?那岂不是在长期insert和delete的操作中,数据库文件会无限增大,即使数据很少执行全表扫描也会扫描一遍所有被标记delete的数据

正在回答

1回答

删除的数据的空间会被重用的,所以不会出现无限增大的情况,另外如果是做了批量删除操作,可以通过optimize table命令来回收空间。

0 回复 有任何疑惑可以回复我~
  • 提问者 烈焰卡卡 #1
    mysql是否有自动定期释放回收空间的机制呢?我有一个这样的需求,有一个表,只做insert delete操作,数据不会很多,insert的数据过段时间一定会被处理delete掉,但是我定时会做一个全表扫描。我现在想知道,由于我没有update,相当于插入的永远是新的id的数据,这个空间是否还会被重用?时间久了以后,全表扫描会不会由于被标记Delete的数据过多,导致数据不多,实际扫描的数据是线性增加的?
    回复 有任何疑惑可以回复我~ 2020-03-20 14:31:58
  • sherlock陈 回复 提问者 烈焰卡卡 #2
    由于空间会被重用,只要生产的数据量和删除的数据量能保持一致性,实际扫描的数据就只是当前生产的和删除的数据量总和,但如果做了批量删除,说明删除的数据很多,生产的没有跟上删除的,这个时候就需要手动回收下空间了
    回复 有任何疑惑可以回复我~ 2020-03-20 16:27:13
  • 提问者 烈焰卡卡 回复 sherlock陈 #3
    批量删除回收空间这个我了解,就是说,即便插入的数据id列永远在自增,mysql也会在对新事务都没影响的时候,将新插入的数据覆盖在被标记删除的数据上,是这个意思么?像您说的,批量删除如果不回收空间,此时做全表扫描,会扫描到所有被标记删除的数据么?
    回复 有任何疑惑可以回复我~ 2020-03-20 16:38:01
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信