数据库中的数据删除有两种方式,一种是物理删除,即直接 delete 掉,还有一种是逻辑删除,即通过一个字段标识他已经被删除了。
很多公司都是采用逻辑删除的方式,甚至完全禁止物理删除。为什么呢?
这一个比较好理解、一旦物理删除了,这数据就都没有了,那么后续想要做数据分析、数据报表、或者历史的问题排查就不方便了。
许多行业,如金融、医疗和法律等,他们受到严格的数据保留法规约束,必须在一定期限内保留所有业务数据以便审计。逻辑删除使得被删除的数据仍然保留在系统中,满足法规审计要求。
物理删除数据可能会影响数据库中的引用完整性。例如,如果一个表的数据被删除,而这些数据正在被其他表引用,则可能导致数据不一致或引用错误。逻辑删除保持数据在数据库中的存在,从而避免了引用完整性问题。
在大规模数据库中,物理删除大量数据可能会对系统性能产生较大影响,因为它可能触发大量的索引重构。逻辑删除通过简单的标记操作减少了这种性能负担。
参考:
在 InnoDB中,delete执行后,只是给数据做了个标记,但空间并不会立即释放。这导致数据页中可能存在大量未使用的空间,增加了数据的分散程度,这就是碎片。
综上,所以很多公司是直接禁止物理删除数据的,一般都是给表中创建一个 is_deleted 字段,0表示未删除,1表示已删除。
虽然很多公司不允许线上数据做物理删除,但是也有特殊情况。比如说做数据归档。
有的时候,我们会定期的将历史数据做归档 ,即经他们从当前库腾挪到历史库中,做到冷热数据的分离,这样可以大大降低当前库的数据量,提升查询效率。这时候就可能需要物理删除了。只不过这种删除一般都是基于时间批量删除,并且会在删除后做碎片清理。