Mysql删除数据的方式有哪些?
常用的删除方式:通过delete,truncate,drop 关键字进行删除;三种都可以用来删除数据,but场景不同。
相比之下,执行速度
drop>truncate>delete
原理上:一.DELETE
DELETE FROM table_name WHERE
1.DELETE属于数据库DML操作语言,只会删除数据不删除表结构,会走事务,执行时会触发trigger(后序我会在提到mysql触发器)
2.在InnoDB中,DELETE其实不会真的把数据删除,mysql实际上只是给删除的数据打了个标记为已删除,因此DELETE删除表中的数据时,表文件在磁盘上所占空间不会变小,存储空间不会被释放,只是把删除的数据行设置为不可见(你真的删了嘛)。苏然未释放磁盘空间,但是下次插入数据的时候,依然可以重用这部分空间(覆盖掉);
3.DELETE执行时,会将所删除数据缓存到rollback segement中,事务commit之后生效;
4.delete from table_name删除表数据,对于MyISAM会立即释放磁盘空间,InnoDB不会;
5.delete操作后使用optimize table table_name会立刻释放磁盘空间,支持InnoDB and MyISAM,所以想要达到释放磁盘空间目目的,delete后执行optimize table操作。对table进行优化
6.delete操作时一行行执行,同时会将该行的删除日志记录在redo和undo表空间
二.truncate
truncate table table_name
1.truncate:属于数据库DDL定义语言,不走事务,原数据不放到rollback segment中,操作不触发tigger;
执行后立即生效,无法找回(开始起跑,别回头)
2.truncate table table_name立刻释放磁盘空间,支持InnoDB and MyISAM. truncate table 类似 drop table ->create ,速度接近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开始;
三,drop
1.drop属于DDL语言;
执行后立即生效,无法找回(开始起跑,别回头)
2.drop table table_name 立刻释放磁盘空间,支持InnoDB and MyISAM;drop语句会删除表结构,依赖约束,触发器,索引;
依赖于该表的存储过程/函数保留,为invaild状态;
所有的删库跑路只有一个条件:你必须跑的够快!!!