MySQL--二(删除)
MySQL通常通过 delete、truncate、drop 关键字进行删除;这三种都可以用来删除数据,但场景不同。
一、从执行速度上来说
drop>truncate>delete
二、从原理上讲
1、delete
delete属于数据库DML操作语言,只删除数据不删除表的结构;
在InnoDB中,delete其实不会真的把数据删除,mysql实际上只是给删除的数据打上了一个不可视的标签,标记为已删除,因此delete删除数据时,表文件在磁盘上所占空间大小不会变,存储空间不会释放。虽然未释放磁盘空间,但下次插入数据时仍然可以重用这一部分(重用 --> 覆盖);
delete执行时,会先将删除数据缓存到rollback segement中,事务提交后生效;
delete from table_name删除表的全部数据,对于MYISAM会释放磁盘空间,InnoDB不会释放磁盘空间;
对于delete from table_name where ...带条件的删除,MYISAM和InnoDB都不会释放磁盘空间;
delete操作后使用optimize table table_name(空间优化)会立刻释放磁盘空间,无论是MYISAM还是InnoDB;
delete操作是一行一行执行删除的,且同时将该行的操作日志记录在表空间中方便回滚和重做操作,生成的大量日志会占用磁盘空间。
2、truncate
truncate属于数据库DDL定义语言,不走事务;
truncate from table table_name立刻释放磁盘空间,无论是MYISAM还是InnoDB。truncate table类似于drop table然后create;
truncate能够快速清空一个表,并且重置auto_increme(自增索引)的值;
3、drop
drop属于数据库DDL定义语言,同truncate;
drop table table_name立刻释放磁盘空间;