MySql Innodb引擎,对表数据应该逻辑删除还是物理删除?

     在Mysql InnoDB存储引擎中,随着互联网产品的运营,一个表的数据肯定会有增加、更新和删除, 那么究竟是物理删除还是逻辑删除好呢?

  • Delete

     物理删除:在InnoDB存储页(page,每页默认16k大小,读写访问的最小单元)中把数据实际删除掉,但空间并没有被回收,该空间其实还是被占着,除非进行页重组(耗性能)。

     逻辑删除:只是做标记,一直占着页数据。

  • Insert影响

     对于表的pk都是自增的设计来说,其实物理删除后,除非进行页重组,否则该页的空闲空间是永远用不上的(非自增id的话,可以通过可重用链表找到这样的空间重复利用),为什么?

     这是因为bTree+机制下,数据行是按照pk从小到大依次存储的(bTree+有顺序的特性),比如现在pk为1-100,删掉pk为50的数据,新增的101数据得挨着100的数据存储,并不能存储到以前50那空间去。

  • Select影响

      采用逻辑删除的情况下,则从磁盘拿一次数据时(1页,16k),本来能拿回来16条(假设每条数据1k),但里面有5条是逻辑删除的数据,有效的数据只有11条,必然会增加IO次数,影响性能。更重要的事,这5条逻辑删除的数据也是被存进buffe_pool的,占用了缓存内存空间,其实是无效缓存。

      采用物理删除的情况下,在pk字段自增的情况下,空闲的空间也用不上(没有做页重整情况下),造成很大浪费,影响查询性能。但非自增的pk,比如uuid就不存在这个问题。

      综合来说,仅从性能角度来考虑,在pk字段自增的情况下,用物理删除 + 表页手工重组的方式比较合适(alter table order_info engine innodb)。

      但从数据安全性等角度考虑,用逻辑删除好处是能够方便找回误操作的重要数据。(也可以用单建库、建表存储历史版本解决该问题)。

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值