查看大图
作者 | 朱钢
出品 | 脚本之家(ID:jb51net)
这两年 IT 界隔三岔五的泛起一次顺序员删库的旧事,这类删库跑路的行动往往会给受益公司形成很大的损失,乃至会致使一个公司的破产。咱们顺序员看到这种旧事的时分很大一部份会把它当做一个闲谈的摊子,然而各位读者你是不是想过这么一个问题:我知道怎么正确删库吗?看到这里估量有读者会觉得删库谁不会啊Delete一下呗。假如你这么想的话那就接着看这篇文章吧,在前面的内容中我将讲授数据库删除数据的形式以及原理。
查看大图
在 MySQL 中有三种删除数据的形式,分别是delete、drop和truncate。这三种形式用起来简略,然而面前的原理和留意事项估量大部份开发人员其实不分明,上面我就来说解一下原理以及留意事项。
Delete 是数据库 DML 操作言语,在删除数据的时分只会删除数据而不会删除数据所在表的表构造,而且在删除数据的时分会履行事务和触发trigger。并且假如你所使用的数据库引擎是 InnoDB 的话 MySQL 会在履行删除数据操作的时分只把数据标注为已删除而不去真实的删除数据,因此在这类状况下假如你使用 Delete 删除数据的时分会发现表大小并无改动。
然而当你的数据库引擎是 MyISAM 的状况下履行 delete from table 语句会真实的删除表中的数据并释放空间的,假如你想让 MyISAM 引擎也能完成 InnoDB 引擎假删除的成果的话,你需求在 Delete 语句前面加之 Where 前提便可,例如 delete from user where age
查看大图
这时候确定有杠精的小敌人会说:“我就想使用 InnoDB 引擎,我也想释放被删除数据所占用的空间。”这类设法 MySQL 为咱们提供理解决计划,那就是optimize table语句,咱们来看一下例子:咱们用 Delete 语句删除表中一切的数据后咱们来查看一下当初这张表所占的空间大小(如下图)
查看大图
从上图中咱们能够看到咱们删除了 book 表中的一切数据,然而该表所占用的空间大小简直没产生变动。这时候咱们履行 optimize table 语句后再次查看表的空间大小,咱们发现表的大小变为了 0.02M,只剩下了表构造的大小了(如下图)