主页 > 知识库 > 你也许连删库跑路都不会(delete、drop和truncate删除数据)

你也许连删库跑路都不会(delete、drop和truncate删除数据)

热门标签:呼叫中心市场需求 服务外包 百度竞价排名 铁路电话系统 网站排名优化 AI电销 Linux服务器 地方门户网站

前言

这两年 IT 界隔三岔五的出现一次程序员删库的新闻,这种删库跑路的行为往往会给受害公司造成很大的损失,甚至会导致一个公司的破产。我们程序员看到这类新闻的时候很大一部分会把它当作一个闲聊的摊子,但是各位读者你是否想过这么一个问题:我知道怎么正确删库吗?看到这里估计有读者会感觉删库谁不会啊 Delete 以下呗。如果你这么想的话那就接着看这篇文章吧,在后面的内容中我将讲解数据库删除数据的方式以及原理。

在 MySQL 中有三种删除数据的方式,分别是 delete、drop 和 truncate。这三种方式用起来简单,但是背后的原理和注意事项估计大部分开发人员并不清楚,下面我就来讲解以下原理以及注意事项。

一、delete

Delete 是数据库 DML 操作语言,在删除数据的时候只会删除数据而不会删除数据所在表的表结构,并且在删除数据的时候会执行事务和触发 trigger。而且如果你所使用的数据库引擎是 InnoDB 的话 MySQL 会在执行删除数据操作的时候只把数据标注为已删除而不去真正的删除数据,因此在这种情况下如果你使用 Delete 删除数据的时候会发现表大小并没有改变。

但是当你的数据库引擎是 MyISAM 的情况下执行 delete from table  语句会真正的删除表中的数据并释放空间的,如果你想让 MyISAM 引擎也能实现 InnoDB 引擎假删除的效果的话,你需要在 Delete 语句后面加上 Where 条件即可,例如 delete from user where age18 这段语句执行后符合条件的数据将会标注为删除,并且所占空间不释放。

这时肯定有杠精的小朋友会说:“我就想使用 InnoDB 引擎,我也想释放被删除数据所占用的空间。”这种想法 MySQL 为我们提供了解决方案,那就是 optimize table 语句,我们来看一下例子:我们用 Delete 语句删除表中所有的数据后我们来查看以下现在这张表所占的空间大小(如下图)


从上图中我们可以看到我们删除了 book 表中的所有数据,但是该表所占用的空间大小几乎没发生变化。这时我们执行 optimize table 语句后再次查看表的空间大小,我们发现表的大小变成了 0.02M,只剩下了表结构的大小了(如下图)


我们在用 Delete 语句删除数据的时候需要注意的是 delete 操作是一行一行的执行的,并且会将每行的删除日志记录在 redo 和 undo 表空间中以方便日后回滚和重做,这样就产生大量的日志进而占用大量的空间。因此当我们在进项大规模删除数据的时候不建议使用 Delete 语句。

Tip:这里有一个比较有意思的地方:虽说被删除数据所占用的空间没有被释放,但是当我们执行 Insert 操作的时候这部分未被释放的空间依然是可以被重用的。

二、truncate 和 drop

truncate 是数据库 DDL 语言,它和 delete 最大的区别是它不走事务数据也不放在 rollback segment 里,同时也不会触发 trigger, 因此执行 truncate 语句后会立即删除指定的数据且无法恢复,并释放数据所占用的空间(不管使用的数据库引擎是 InnoDB 还是 MyISAM )。truncate 语句一般用于快速清空表中数据并需要重置 auto_increment 值的情况。

关于重置 auto_increment 值需要有如下两点注意:

  • 在使用 InnoDB 引擎的情况下如果使用 truncate autoincrement会重置为 1 ,但是如果使用 delete 则 autoincrement 在重启 MySQL 之前仍然保持当前值,重启值后重置为 1 ;
  • 在使用 MyISAM 引擎的情况下如果使用 truncate autoincrement会重置为 1 ,但如果使用 delete 则 autoincrement 仍然保持当前值。

drop 同样是数据库 DDL 语言,它和 truncate 一样一旦执行将立即删除表和依赖、触发器、索引,但是会保留和该表相关的存储过程以及函数,并将状态改为 invalid 。

总结

上面讲这么多简单总结一下:如果把表比喻成一个包子的话,那么 delete 就是把馅从包子里拿出来放在别的盘子里,truncate 就是把馅从包子里拿出来吃掉,drop 就是直接把包子吃掉。

删库的技能学会了吗?

您可能感兴趣的文章:
  • 详解MySQL中DROP,TRUNCATE 和DELETE的区别实现mysql从零开始
  • sqlserver中drop、truncate和delete语句的用法
  • drop,truncate与delete的区别
  • 数据库中删除语句Drop、Delete、Truncate的相同点和不同点的比较(实例说明)
  • 详解SQL中drop、delete和truncate的异同
  • 浅析删除表的几种方法(delete、drop、truncate)
  • MySQL删除表操作实现(delete、truncate、drop的区别)
  • 秒懂drop、truncate和delete的区别
  • SQL删除语句DROP、TRUNCATE、 DELETE 的区别
  • delete、truncate、drop的区别以及该如何选择

标签:崇左 黄山 兰州 衡水 湖南 湘潭 铜川 仙桃

巨人网络通讯声明:本文标题《你也许连删库跑路都不会(delete、drop和truncate删除数据)》,本文关键词  ;如发现本文内容存在版权问题,烦请提供相关信息告之我们,我们将及时沟通与处理。本站内容系统采集于网络,涉及言论、版权与本站无关。
  • 相关文章
  • 收缩
    • 微信客服
    • 微信二维码
    • 电话咨询

    • 400-1100-266