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)。

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

 

  • 2
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

Soft21

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值