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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/58575.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习中的嵌入是什么?

一、说明 嵌入是真实世界对象的数字表示,机器学习(ML)和人工智能(AI)系统利用它来像人类一样理解复杂的知识领域。例如,计算算法了解 2 和 3 之间的差为 1,这表明与 2 和 100 相比,2…

Python | Leetcode Python题解之第517题超级洗衣机

题目: 题解: class Solution:def findMinMoves(self, machines: List[int]) -> int:tot sum(machines)n len(machines)if tot % n:return -1avg tot // nans, s 0, 0for num in machines:num - avgs numans max(ans, abs(s), num)return ans

若依框架部署到服务器后头像资源访问404

排错过程 第一开始以为是代理出问题了 官网给出的解决方案 第一种是用代理后端接口,第二种是重写路径直接访问静态文件 接口通过捕获profile开头的路径/profile/avatar…,转为/home…/avatar找到我们在该路径下的文件 但是我想了一下,我ngin…

《手写Spring渐进式源码实践》实践笔记(第十二章 aop融入bean生命周期)

提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 第十二章 将AOP融入Bean生命周期背景目标设计实现代码结构类图实现步骤 测试事先准备自定义拦截方法Spring.xml 配置AOP测试用例测试结果: 总结 第十二章…

Three.js 快速入门构建你的第一个 3D 应用

![ 开发领域:前端开发 | AI 应用 | Web3D | 元宇宙 技术栈:JavaScript、React、Three.js、WebGL、Go 经验经验:6年 前端开发经验,专注于图形渲染和AI技术 开源项目:github 晓智元宇宙、数字孪生引擎、前端面试题 大家好…

C#界面设计--9--fatal error C1083: 无法打开包括文件:“jruparse.h”: No such file or directory

1、VS2008-编译时报错“fatal error C1083: 无法打开包括文件:“jruparse.h”: No such file or directory” 2、问题出现的原因及解决方法 1、如果要引入的这些,h文件跟.cpp在同一个目录下,就不会出现这种问题,检査在工程的include目录下是不是真的存…

算法:排序

排序算法 1. 简单排序1.1 直接插入排序1.2 冒泡排序1.3 简单选择排序 2. 希尔排序3. 快速排序4. 堆排序5. 归并排序 将文件的内容按照某种规则进行排列。 排序算法的稳定判定:若在待排序的一个序列中, R i R_i Ri​和 R j R_j Rj​的关键码相同&#xf…

OpenCV视觉分析之目标跟踪(6)轻量级目标跟踪器类TrackerNano的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 Nano 跟踪器是一个超轻量级的基于深度神经网络(DNN)的通用目标跟踪器。 由于特殊的模型结构,Nano 跟踪器速度…

【新人系列】Python 入门(六):基础内容 - 上

✍ 个人博客:https://blog.csdn.net/Newin2020?typeblog 📝 专栏地址:https://blog.csdn.net/newin2020/category_12801353.html 📣 专栏定位:为 0 基础刚入门 Python 的小伙伴提供详细的讲解,也欢迎大佬们…

WPF+MVVM案例实战(七)- 系统初始化界面字体描边效果实现

文章目录 1、案例效果展示2、项目准备3、功能实现1、资源获取2、界面代码3、后台代码4 源代码获取1、案例效果展示 2、项目准备 打开项目 Wpf_Examples,新建系统初始化界面 WelcomeWindow.xmal,如下所示: 3、功能实现 1、资源获取 案例中使用的CSDN文字为路径文字,从字体…

MFC工控项目实例二十七添加产品参数

承接专栏《MFC工控项目实例二十六创建数据库》 在型号参数界面添加三个参数试验时间、最小值、最大值。变量为double m_edit_time; double m_edit_min; double m_edit_max; 1、在SEAL_PRESSURE.h中添加代码 class CProductPara { public:union{struct{...double m_edit_min;…

【02】ZooKeeper经典应用场景实战一

1、ZooKeeper Java客户端实战 ZooKeeper应用的开发主要通过Java客户端API去连接和操作ZooKeeper集群。可供选择的Java客户端API有: ZooKeeper官方的Java客户端API。第三方的Java客户端API,比如:Curator ZooKeeper官方的客户端API提供了基本的…

信息安全工程师(73)网络安全风险评估过程

一、确定评估目标 此阶段需要明确评估的范围、目标和要求。评估目标通常包括特定的网络系统、信息系统或网络基础设施,评估范围可能涉及整个组织或仅特定部门。明确评估要求有助于确保评估过程的针对性和有效性。 二、收集信息 在评估开始之前,需要对目标…

Vmos pro-虚拟机 解锁永久vip

[应用名称] 应用名称:Vmos pro [应用版本] 应用版本:2.99 [软件大小] 软件大小:32.2mb [应用简介] 应用简介:Vmos Pro这款安卓虚拟机平台,提供了多样化的ROM版本选择。用户可根据自身需求更换ROM,调…

华为OD机试 - 最多购买宝石数目 - 滑动窗口(Python/JS/C/C++ 2024 C卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…

1:基本电路专题:R(电阻)的介绍

说实话这个其实我不想写的,因为这个是初中的知识,并没有很难,但是为了保持整齐性,我还是写了一下关于这个的知识点。是电子学中三大基本无源元件之一。(R(电阻),L(电感),…

基于SpringBoot的“CSGO赛事管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“CSGO赛事管理系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统首页界面图 赛事信息界面图 赛事通知界面…

漏洞挖掘 | 通过域混淆绕过实现账户接管

由于这是一个私有项目,我将使用 example.com 来代替。 很长一段时间以来,我一直想在漏洞赏金项目中找到一个账户接管(ATO)漏洞。于是,我开始探索项目范围内的 account.example.com。 我做的第一件事就是注册一个新账…

视觉目标检测标注xml格式文件解析可视化 - python 实现

视觉目标检测任务,通常用 labelimage标注,对应的标注文件为xml。 该示例来源于开源项目:https://gitcode.com/DataBall/DataBall-detections-100s/overview 读取 xml 标注文件,并进行可视化示例如下: #-*-coding:ut…

地理征服营销与开源 AI 智能名片 2 + 1 链动模式 S2B2C 商城小程序的融合创新

摘要:本文探讨了地理征服营销这一创新营销策略与开源 AI 智能名片 2 1 链动模式 S2B2C 商城小程序的融合应用。首先阐述地理征服营销的概念和实施要点,接着介绍开源 AI 智能名片 2 1 链动模式 S2B2C 商城小程序的功能与优势,分析二者结合如…