MySQL有建议过不要使用他们家的DELETE吗?在MySQL 8.0的官方文档里没有找到不建议使用DELETE的文字。
DELETE VS NOT DELETE,这是由来已久的问题
时间回到2009的8月30号。大佬Ayende Rahien——也被称为Oren Eini,Hibernating Rhinos公司的CEO,创建了RavenDB,在其个人博客上发布文章《避免软删除》
另一位大佬Udi Dahan——著名的软件架构师和分布式系统与面向服务架构(SOA)领域的专家,创立了著名的开源消息框架NServiceBus, 在其个人网站发表了一篇文章《完全避免删除数据》作为回应。
Ayende Rahien建议避免软删除,因为此举破坏了关系型数据库中的“关系”:“为了保持数据的完整性,他应该级联删除行和所有相关数据”。
而Udi Dahan表示反对,因为“现实世界并不会自动级联删除”。但是建议不使用IsDeleted标志,而是使用一个包含相关数据状态的字段:活动的、停产的、已取消的、已废弃的等等。
另外:
推荐一个程序员免费学习的编程网站:我爱编程网(www.love-coding.com)
涵盖 Java几乎覆盖了所有主流技术面试题,还有市面上最全的技术精品系列教程,免费提供。
也许只是阿里的面试官不建议在MySQL使用delete删除数据,并请你为他找点理由。
理由一:DELETE操作是重量级的
DELETE操作是一项重量级的任务,它需要执行以下步骤:
1、找到要删除的数据行。
2、检查和执行与DELETE语句中指定的条件匹配的数据行。
3、更新索引以反映删除操作。
4、写入事务日志以确保数据一致性。
这些步骤对于每一行都要执行,因此如果要删除大量数据,DELETE操作会变得非常耗时。在高负载的生产环境中,这可能会导致数据库性能下降,影响其他查询和事务的执行。
理由二:DELETE操作可能引发锁问题
DELETE操作通常需要对要删除的数据行加锁,以确保其他事务不会同时修改这些数据行。这种锁定机制可能导致以下问题:
1、死锁:如果多个事务同时尝试删除相同的数据,它们可能会陷入死锁状态,导致应用程序停滞不前。
2、阻塞:其他查询和事务可能会被DELETE操作的锁定所阻塞,影响系统的响应时间。
问题三:DELETE操作不可逆
一旦执行DELETE操作,删除的数据将永久丢失,无法恢复。这可能会导致数据丢失的风险,特别是在没有进行数据备份的情况下。如果操作错误或者删除了重要数据,后果可能是灾难性的。
正确的删除数据方法
为了避免上述问题,MySQL提供了一种更安全和高效的删除数据方法,即使用标记删除(Soft Delete)或者归档数据。这些方法通常包括以下步骤:
1、添加一个额外的列(例如,status列)来标记数据行的状态。这个列可以是枚举值(例如,‘active’和’deleted’)或者布尔值(0表示未删除,1表示已删除)。
2、而不是执行DELETE操作,将数据行的状态更改为已删除或者归档状态。这可以通过UPDATE语句来完成。
3、当需要查询数据时,始终使用WHERE条件来过滤掉已删除或者归档的数据行。
标记删除和归档数据的方法具有以下优点:
数据不会永久丢失,可以在需要时轻松恢复。
不会引发死锁问题,因为没有数据被物理删除。
查询效率更高,因为不再需要执行DELETE的重量级操作
个人观点
删除不删除数据,完全是基于系统设计考量的,要看具体的需求。
软删除数据会有效降低数据丢失的风险,更好地满足审计需求,但是会显著增加设计复杂度,破坏级联关系。
在某些领域比如BI系统中,事实表一般是不删除任何数据的,因为事实发生了就无法改变,也不能被消灭,所以事实表的所有数据都应被存档。
但是在一些特定的业务系统中可能需要硬删除,以及时清理垃圾数据,当然还要配合高性能的索引方案。
但是,这一切无关数据库的种类,更谈不上数据库的性能问题。一个数据库的最基本指令,哪有性能不佳的道理?
MYSQL表示:阿里说的,这锅我不背。
你怎么看?欢迎在评论区分享你的想法哦!