精华内容
下载资源
问答
  • 物理删除和逻辑删除

    2021-05-07 14:36:09
    物理删除和逻辑删除(0、1) 1、物理删除 I.概念 使用delete、truncate、drop语句删除数据 物理删除就是把数据从硬盘中删除,释放空间,缩小体积,对性能的提升有帮助 II.缺点 物理删除是从根源上面删除,...

    1、物理删除

    	I.概念
    		使用delete、truncate、drop语句删除数据
    		物理删除就是把数据从硬盘中删除,释放空间,缩小体积,对性能的提升有帮助
    	II.缺点
    		物理删除是从根源上面删除,几乎无法恢复数据
    		物理删除会造成主键不连续,分页查询数据慢
    	III. 应用的地方
    		核心的业务表不用物理查询
    

    2、逻辑删除

    	I.概念
    		逻辑删除并不是正真的删除,而实将表中对应的是否删除表示(is_delete)或者说是状态字段(status)做修改
    		操作。比如0是未删除,1是删除。在逻辑上数据是被删除了但是数据本身还在数据库中,只是不进行对外提供了
    	
    		逻辑删除的本质是修改操作(将is_delete的值进行0和1之间的修改)。
    	II.应用
    		电脑的回收站使用的原理就是逻辑删除。删除的文件进入回收站的本质知识在操作系统的帮助下对文件加上了某种
    		标记,资源管理器对这种含有标记的文件不显示。当回收站恢复的时候,即移除这种标记。
    		
    		当清空回收站的时候进行的是物理删除。一般的商城网站使用的是逻辑删除来操作数据库。
    
    展开全文
  • 逻辑删除还是物理删除

    千次阅读 2020-06-04 14:58:19
    ”其实呢数据删除没有你想的这么简单,一般情况下公司会明确的要求数据只能逻辑删除,不能物理删除。那什么优势逻辑删除,什么又是物理删除呢? 物理删除 就是我们之前常用的DELETE、TRANCATE、DROP语句删除数据,...

    看到标题,有的童鞋心中暗想“数据删除有什么可提的呢?不就是执行个delete语句吗?有什么难的呀?”其实呢数据删除没有你想的这么简单,一般情况下公司会明确的要求数据只能逻辑删除,不能物理删除。那什么优势逻辑删除,什么又是物理删除呢?

    物理删除

    就是我们之前常用的DELETE、TRANCATE、DROP语句删除数据,不管你用哪种方式,都是将数据从硬盘上抹除, 这样数据表的体积就变小了,数据的读写性能就提上去了。
    有个共识InnoDB引擎的数据表记录一旦超过2000万,它的读写性能就很差,我们用物理删除能缩小表的体积,提升读写性能,这挺好的,原则上也是这么一个道理,但是物理删除数据的代价你了解吗?

    物理删除的代价一

    由于物理删除是真的被删除的,当我们发现数据是被误删除的,那么恢复起来是非常困难的,恢复数据还要停掉数据库,对业务系统的影响是非常大的,所以误删除的后果是非常严重。

    我有一个在携程网工作的DBA朋友,他说“如果那里的数据出了问题,停机维护成本还是挺大的,因为好多人都用携程app来买机票跟酒店” 他以前跟我说过一次,携程网停机一小时损失差不多是在一两百万的情形,如果业务系统停机还好说,因为业务系统都是分布式集群的部署的,前台系统和后台系统分别部署在不同的节点,挂掉几个对整体影响也不是很大。但是别看数据库也在搞集群,但是数据除了问题那么可是所有的MySQL节点要停机维护的,业务系统没有了数据库还运行个什么劲呢?所以数据库的运行可靠性是非常重要的,不能出现一丁点儿事儿的。

    那么数据库误删除是怎么发生的呢?比如说,小王在程序里写了一个带有bug的delete语句,平时这个sql语句运行还算正常,但是传入特殊的数据导致bug运行,就会误删除很多的数据,这样的结果真的是非常严重。如果误删除了数据,有什么办法恢复数据吗?当然有了,如果误删除了数据,需要停掉数据库才行,对业务系统的影响是非常大的。

    具体的执行时这样的:
    在这里插入图片描述

    平时我们数据库在执行SQL语句的时候是这样的,这些操作记录在binlog日志里面,恢复数据的时候,你们编写程序提取binlog日志里面的内容然后逐条分析,看看是那一条sql语句导致的误删除,导出binlog日志里面的sql语句,当然了这些sql语句里面是不包含误删除的那条sql语句,因为我们把它给抠掉了,接下来启动数据库,清空数据表里的所记录,然后把这些sql语句重新执行一遍,就相当于把以前的增删改查又执行了一遍,这样数据就恢复了。

    除了这种方式外,还有一种恢复数据库的办法,那就是为MySQL配置延迟删除节点,也就是再弄一个MySQL数据库,让这两个数据库做延迟同步数据,当一个MySQL出现了误删除,因为有延迟同步,比如说延迟24小时数据再同步,也就是再24小时内,都可以从第二个MySQL节点来同步数据,然后恢复到第一个MySQL节点上面,这也是恢复删除的办法,像这些开脑洞的方法,在MySQL集群PXC方案都有

    物理删除的代价二

    会让数据的主键值变的不连续,不连续的主键值会让分页查询的速度变慢。我们看下面例子

    正常的分页查询语句会在select语句后面加上Limit

    SELECT ... FROM ... LIMIT 1000,20 ;
    

    我想从1000条数据中取20条记录,这个语句就写成了limit 1000,20 ,那这条sql执行的时候,数据库可要从第一条计数,数到1000条的时候,开始往后查询20条数据,当然我现在要想查询10万条以后的数据, 数据库就得从头计数,从第一条数到10万条记录,然后再往后查询你想要的数据,越是数据越多,这个limit后面你所要查询的就越慢,所以我们要像一个办法去解决分页查询的问题。

    于是我们想到了利用主键字段加速分页查询的办法,这个分页查询就写成了这个样子

    select ... from ... where id>=1000 and id<=1020;
    

    因为主键是自带索引的,索引就是对字段进行排序,那么查询的时候可以快速跳过很多的数据,直接定位到我们想要的数据,像英文词典,如果想要查找Object这个单词,直接就可以定位到O开头的单词去小范围的查找,这样就加快了查询的速度。如果英文单词的排序不是按照首字母排序,我查找Object的时候就得从第一页翻到最后一页,非常的耗时。
    那我们再来看id>1000这个顺序,因为主键是按照顺序排序的,索引数据库可以很快的定位到id=1000这样的记录,查询的速度是非常快的,后续的查询也是做的这么个二叉树的查找,所以用主键去做分页查询的条件,个查询的速度比limit子句快的多。

    但是现在有个问题,如果我们对数据做了物理删除,这个主键就变成不连续的了,也就是意味着利用主键来分页查找是不行的,因为从1000到1020这个主键范围之间可能只有几条数据而不是完整的20条记录。

    这就是物理删除的第二个代价,没有办法用主键这种加速分页查询了。当然了,在一些必须要物理删除的情形下,还是有折中的加速分页查询的方法

    什么样的数据不适合物理删除

    核心业务表的数据不建议做物理删除,因为物理删除后,真的就只能停机恢复数据,这个代价真的非常大,反之我们可以对需要删除的记录做状态上的变更,而不是非要删除它们,这就是逻辑删除的原理

    我们看下例子,给作废的订单设置为作废的状态,给注销的订单设置为注销的状态,给过期的优惠券设置为过期的状态,这都是可以的。
    当然,有童鞋会说“如果表里存放了大量无效的数据,这个会占用表的空间,那么Innodb这种引擎,一张表的数据超过2000万性能就会下降的很快,那么用逻辑删除表是不是就会增长的很快呢?”,这种问题问的非常的好,这是童鞋是认真思考了,这个问题可以很优雅的解决,那就是再创建一张数据表历史表,这个表专门用来保存无效的数据,并且这个表还可以使用mongodb数据库,因为逻辑删除的数据重要性并不是那么高,主要保存下来即可。

    最后来说下逻辑删除

    • 其实刚才我们已经知道逻辑删除的原理了,我们可以给表添加一个字段(is_deleted),标记该字段已经逻辑删除,我们在查询数据的时候在where子句上加上is_deleted=0那么查询出的就是那些没有被物理删除的记录了

      select ... from ... where is_deleted=0;
      
    • 核心数据表一定要采用逻辑删除,而不是物理删除
      像订单表、商品表都要采用逻辑删除。上面说把逻辑删除的记录都放到历史表,不就可以不用给数据表添加is_deleted字段了吗?
      不是多次一举,如果平时我们的数据库系统都是满负荷的工作,数据迁移这种工作我们可以放到后半夜去做,那样的数据库的负载比较低,我们给数据库设计了is_deleted字段后,标记了那些数据是要殴删除的,通过编写一个定时器程序,把要删除的数据转移到历史表,这样不是挺好的吗?也就是白天业务表还是要缓存一些逻辑删除的数据,等到后半夜我们再做系统的迁移。

    我们给t_user表做逻辑删除

    1. 创建历史表的sql语句:

      create table t_user_history LIKE t_user;
      
    2. 添加一个is_delete字段

    展开全文
  • java 物理删除和逻辑删除 逻辑删除:文件没有被真正的删除,只不过是文件名的第一个字节被改成操作系统无法识别的字符,通常这种删除操作是可逆的,就是说用适当的工具或软件可以把删除的文件恢复出来。 物理删除:...

    java 物理删除和逻辑删除

    逻辑删除:文件没有被真正的删除,只不过是文件名的第一个字节被改成操作系统无法识别的字符,通常这种删除操作是可逆的,就是说用适当的工具或软件可以把删除的文件恢复出来。
    物理删除:指文件存储所用到的磁存储区域被真正的擦除或清零,这样删除的文件是不可以恢复的
    物理删除是计算机处理数据时的一个概念。 与物理删除相对应的是逻辑删除。逻辑删除就是对要要删除的数据打上一个删除标记,在逻辑上是数据是被删除的,但数据本身依然存在!而物理删除则是把数据从介质上彻底删除掉。

    配置逻辑删除的步骤:

    1. 在配置文件yml中应该配置的信息
    
    mybatis-plus:
      global-config:
        db-config:
          logic-delete-value: 1 # 逻辑已删除值(默认为 1),该具体删除值和数据库中的表数据对应即可
          logic-not-delete-value: 0 # 逻辑未删除值(默认为 0),该具体删除值和数据库中的表数据对应即可
    
    1. 添加实体类注解
    @TableLogic
    private Integer delFlag;
    
    1. 对于逻辑删除拦截器bean的注入方式
    import com.baomidou.mybatisplus.core.injector.ISqlInjector;
    import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * mybatis-plus配置
     *
     * @author gsl
     */
    @Configuration
    public class MybatisPlusConfig {
    
        /**
         * 在配置文件中注册删除组件
         * @return
         */
        @Bean
        public ISqlInjector sqlInjector() {
            return new LogicSqlInjector();
        }
    }
    
    展开全文
  • MySQL 物理删除和逻辑删除 物理删除 概念 1、就是用DELETE、TRUNCATE、DROP语句删除数据 2、物理删除是把数据从硬盘中删除,释放存储空间,缩小表体积,对性能提升有帮助 代价 1、物理删除是真的删除,数据恢复...

    MySQL 物理删除和逻辑删除

    物理删除

    概念

    1、就是用DELETE、TRUNCATE、DROP语句删除数据
    2、物理删除是把数据从硬盘中删除,释放存储空间,缩小表体积,对性能提升有帮助

    代价

    1、物理删除是真的删除,数据恢复难度大
    2、物理删除会造成主键不连续,导致分页查询数据慢

    应用场景

    1、核心业务表的数据不适合做物理删除,只做状态变更。
    2、随着业务表数据增长,如何既不删除数据,有缩小表体积,可以把记录转移到历史记录表

    逻辑删除

    1、即在表中添加一个字段(is_deleteed),用字段值进行标记该数据是否已经逻辑删除,查询时跳过这些数据
    2、核心业务表的数据必须采用逻辑删除

    结论

    核心业务数据必须使用逻辑删除,非业务数据看实际进行选择!

    展开全文
  • 物理删除与逻辑删除

    2019-02-27 10:31:35
    ** 数据库中数据的物理删除与逻辑删除 ...物理删除:指文件存储所用到的磁存储区域被真正的擦除或清零,这样删除的文件是不可以恢复的,物理删除是计算机处理数据时的一个概念。 逻辑删除就是对要...
  • 逻辑删除与物理删除

    2018-12-08 23:43:08
    逻辑删除: 逻辑删除:其实是UPDATE,增加一个逻辑状态的列(0|1)0表示删除 自己设置一个逻辑字段,例如1表示有效,0表示删除即可,默认是1. ...物理删除: DELETE 将打上删除标记的记录物理删除掉,不能恢复 ...
  • 数据库物理删除与逻辑删除

    万次阅读 2018-04-06 15:24:42
    概念 逻辑删除 物理删除 区别对比
  • 逻辑删除和物理删除

    2019-11-07 13:29:01
    在实际开发中基本都会有删除数据的需求,删除又分为逻辑删除和物理删除。下面说下二者的区别: 一、所谓的逻辑删除其实并不是真正的删除,而是在表中将对应的是否删除标识(is_del)或者说是状态字段(status)做...
  • Mybatis实现物理删除和逻辑删除。 1.首先明白什么是物理删除,什么是逻辑删除? 什么是物理删除呢?就是直接干掉数据库的数据,无法再恢复回来。但在当今的企业级项目中,物理删除已经非常少见,而是使用逻辑删除。...
  • 物理删除和逻辑删除 物理删除就是直接从数据库里面把数据删除,一般不可恢复,逻辑删除就是给数据制一个状态,在这个状态下数据不会查出来,如果有必要可以把数据的状态恢复可以显示。一般不建议物理删除,因为这样...
  • 数据库设计:物理删除VS逻辑删除

    千次阅读 2020-05-26 10:59:28
    物理删除VS逻辑删除物理删除概念代价应用场景逻辑删除结论 物理删除 概念 1、就是用DELETE、TRUNCATE、DROP语句删除数据 2、物理删除是把数据从硬盘中删除,释放存储空间,缩小表体积,对性能提升有帮助 代价 1、...
  • 处理项目树物理删除
  • 物理删除: 真实删除 文件储存所用到的磁存储区域被真正的清零,不可恢复 在数据库中直接使用delete、drop删除表数据就属于物理删除 逻辑删除: 假删除 逻辑删除就是在想要被删除的数据上打一个删除标记,只要...
  • 物理删除: 直接对数据表的数据执行delete或者drop指令,实现对数据的清除,数据消失,腾出了存储空间,减少数据量,提高表的访问性能。 逻辑删除: 使用字段标记位(通常使用is_delete)字段来标记是否已删除,数据...
  • 物理删除和逻辑删除的区别

    千次阅读 2019-02-28 14:22:00
    1、“物理删除”是计算机处理数据时的一个概念。与物理删除相对应的是逻辑删除。 2、逻辑删除就是对要要删除的数据打上一个删除标记,在逻辑上是数据是被删除的,但数据本身依然存在!而物理删除则是把数据从介质上...
  • 逻辑删除、物理删除

    千次阅读 2016-12-05 10:52:21
    删除:逻辑删除、物理删除、批量删除。一、逻辑删除 public boolean delete(long id ){ boolean isUpdate=buyer_receive_address.dao.update("update buyer_receive_address set deleted_at =? where id = ?...
  • 逻辑删除:删除是数据库一个字段,is_delete或者status=XXX 这种,调用删除接口只是改变这个字段的值 物理删除:是真正的删除,即数据库没有这条数据了
  • 对于物理删除和逻辑删除

    千次阅读 2017-10-08 09:47:38
    一般基础数据都是逻辑删除 仅关联关系表使用物理删除.
  • 物理删除:就是我们平时正常的删除,直接删除数据库的数据; 逻辑删除:就是增加一个标志字段,通过修改这个字段的值,来删除这个值 具体的实现: 首先,在User.java 中添加一个字段deleted,设置它的初始值为0 //...
  • 物理删除: 真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据 1、根据 ID 删除记录 //根据ID删除记录(物理删除) @Test public void testDeleteById(){ int result = userMapper.deleteById(1...
  • 物理删除与逻辑删除的区别

    千次阅读 2018-05-07 09:48:36
    总体来说:一般基础数据都是逻辑删除仅关联关系表使用物理删除物理删除:DELETE逻辑删除:自己设置一个逻辑字段,例如1表示有效,0表示删除即可,默认是1.update biao set 逻辑删除=0其实是UPDATE,增加一个逻辑...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,017
精华内容 3,206
关键字:

物理删除