zoukankan      html  css  js  c++  java
  • mysql三种删除方式

    一般来说mysql有三种删除数据方式:
    1. delete(常用)
    2. truncate(慎用)
    3. drop
    以上三种方式都可以删除数据,但是使用场景是不同的。

    从执行速度来说:
    drop > truncate >> DELETE

    深入底层来说:
    一、DELETE

    DELETE是属于数据库的DML操作语言,使用delete删除数据时,数据库只能删除数据不能删除表的结构,会触发数据库的事务机制。
    DELETE执行时,会先将所删除数据缓存到rollback segement中,事务commit之后生效;
    另外在mysql不同引擎下使用delete也是有一定区别的:
    在InnoDB中,使用delete其实并不会真正的把数据删除,是一种逻辑删,数据库底层实际上只是给删除的数据做了一个已删除的标记,因此,删除数据后的表占空间大小和删除前是一样的,
    执行delete操作的数据所占的空间,并不会被释放,只是设置了不可见。虽然未释放磁盘空间,但是这一部分的空间是依然可以重复使用的。(重用---》也是就覆盖,新数据将有标记的数据覆盖)
    delete操作以后使用 optimize table table_name 会立刻释放磁盘空间。不管是InnoDB还是MyISAM 。所以要想达到释放磁盘空间的目的,delete以后执行optimize table 操作
    对于带有条件的删除delete语句,执行后,在MyISAM和InnoDB下都不会释放磁盘空间,想要立刻释放空间,执行optimize table table_name即可。
    查看表占磁盘大小SQL:(用M做展示单位)
    SELECT
    concat( round( sum( DATA_LENGTH / 1024 / 1024 ), 2 ), 'M' ) AS table_size
    FROM
    information_schema.TABLES
    WHERE
    table_schema = '库'
    AND table_name = '表'

    优化表存储大小SQL: optimize table 表名

    delete 操作是一行一行执行删除的,并且同时将该行的的删除操作日志记录在redo和undo表空间中以便进行回滚(rollback)和重做操作,生成的大量日志也会占用磁盘空间。

      二、truncate
      TRUNCATE删除sql语句:Truncate table TABLE_NAME
    

    1、truncate:属于数据库DDL定义语言,不走事务,原数据不放到 rollback segment 中,操作不触发 trigger。(慎用删除执行后,元数据就没了,不可恢复)执行后立即生效,无法找回
    2、truncate 删除表会立刻释放磁盘空间 ,不管是 InnoDB和MyISAM 。truncate table其实有点类似于drop table 然后creat,只不过这个create table 的过程做了优化,比如表结构文件之前已经有了等等。所以速度上应该是接近drop table的速度;
    3、truncate能够快速清空一个表。并且重置auto_increment的值。但对于不同的类型存储引擎需要注意的地方是:
    对于MyISAM,truncate会重置auto_increment
    (自增序列)的值为1
    。而delete后表仍然保持auto_increment。
    对于InnoDB,truncate会重置auto_increment的值为1。delete后表仍然保持auto_increment。但是在做delete整个表之后重启MySQL的话,则重启后的auto_increment会被置为1。
    也就是说,InnoDB的表本身是无法持久保存auto_increment。delete表之后auto_increment仍然保存在内存,但是重启后就丢失了,只能从1开始。实质上重启后的auto_increment会从 SELECT 1+MAX(ai_col) FROM t 开始。

      三、drop
      drop删除表sql:Drop table Tablename
    

    1、drop:属于数据库DDL定义语言,同Truncate;执行后立即生效,无法找回
    2、drop table table_name 立刻释放磁盘空间 ,不管是 InnoDB 和 MyISAM; drop 语句将删除表的结构被依赖的约束(constrain)、触发器(trigger)、索引(index); 依赖于该表的存储过程/函数将保留,但是变为 invalid 状态。

    可以这么理解,一本书,delete是把目录撕了,truncate是把书的内容撕下来烧了,drop是把书烧了

  • 相关阅读:
    我爱Java系列之---【SpringBoot打成war包部署】
    279. Perfect Squares
    矩阵dfs--走回路
    112. Path Sum
    542. 01 Matrix
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    Invert Binary Tree
    563 Binary Tree Tilt
    145 Binary Tree Postorder Traversal
  • 原文地址:https://www.cnblogs.com/MrYuChen-Blog/p/13921925.html
Copyright © 2011-2022 走看看