当前位置
主页 > 新闻中心 > 行业新闻 >
也许你连删除数据都不会
2021-10-01 01:53
本文摘要:泉源 l 剧本之家(ID:jb51net)作者 | 朱钢出品 | 剧本之家(ID:jb51net)这两年 IT 界隔三岔五的泛起一次法式员删库的新闻,这种删库跑路的行为往往会给受害公司造成很大的损失,甚至会导致一个公司的破产。我们法式员看到这类新闻的时候很大一部门会把它看成一个闲聊的摊子,可是列位读者你是否想过这么一个问题:我知道怎么正确删库吗?看到这里预计有读者会感受删库谁不会啊 Delete 以下呗。

hth华体会

泉源 l 剧本之家(ID:jb51net)作者 | 朱钢出品 | 剧本之家(ID:jb51net)这两年 IT 界隔三岔五的泛起一次法式员删库的新闻,这种删库跑路的行为往往会给受害公司造成很大的损失,甚至会导致一个公司的破产。我们法式员看到这类新闻的时候很大一部门会把它看成一个闲聊的摊子,可是列位读者你是否想过这么一个问题:我知道怎么正确删库吗?看到这里预计有读者会感受删库谁不会啊 Delete 以下呗。如果你这么想的话那就接着看这篇文章吧,在后面的内容中我将解说数据库删除数据的方式以及原理。

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

deleteDelete 是数据库 DML 操作语言,在删除数据的时候只会删除数据而不会删除数据所在表的表结构,而且在删除数据的时候会执行事务和触发 trigger。而且如果你所使用的数据库引擎是 InnoDB 的话 MySQL 会在执行删除数据操作的时候只把数据标注为已删除而不去真正的删除数据,因此在这种情况下如果你使用 Delete 删除数据的时候会发现表巨细并没有改变。可是当你的数据库引擎是 MyISAM 的情况下执行 delete from table 语句会真正的删除表中的数据并释放空间的,如果你想让 MyISAM 引擎也能实现 InnoDB 引擎假删除的效果的话,你需要在 Delete 语句后面加上 Where 条件即可,例如 delete from user where age<18 这段语句执行后切合条件的数据将会标注为删除,而且所占空间不释放。

hth华体会

这时肯定有杠精的小朋侪会说:“我就想使用 InnoDB 引擎,我也想释放被删除数据所占用的空间。”这种想法 MySQL 为我们提供相识决方案,那就是 optimize table 语句,我们来看一下例子:我们用 Delete 语句删除表中所有的数据后我们来检察以下现在这张表所占的空间巨细(如下图)从上图中我们可以看到我们删除了 book 表中的所有数据,可是该表所占用的空间巨细险些没发生变化。这时我们执行 optimize table 语句后再次检察表的空间巨细,我们发现表的巨细酿成了 0.02M,只剩下了表结构的巨细了(如下图)我们在用 Delete 语句删除数据的时候需要注意的是 delete 操作是一行一行的执行的,而且会将每行的删除日志记载在 redo 和 undo 表空间中以利便日后回滚和重做,这样就发生大量的日志进而占用大量的空间。因此当我们在进项大规模删除数据的时候不建议使用 Delete 语句。

Tip:这里有一个比力有意思的地方:虽说被删除数据所占用的空间没有被释放,可是当我们执行 Insert 操作的时候这部门未被释放的空间依然是可以被重用的。truncate 和 droptruncate 是数据库 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 就是直接把包子吃掉。删库的技术学会了吗?。


本文关键词:华体会体育,也许,你连,删除,数据,都,不会,泉源,剧本,之家

本文来源:华体会体育-www.lichengrobot.com

联系方式

电话:0877-315157620

传真:045-39720975

邮箱:admin@lichengrobot.com

地址:福建省龙岩市同江市建心大楼62号