阿里面试:为什么MySQL不建议使用Delete删除数据?

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表示:阿里说的,这锅我不背。

你怎么看?欢迎在评论区分享你的想法哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

首席架构师专栏

喜欢请点赞,么么哒

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值