Truncate是啥?一篇文章带你一起了解。
DROP-删除表
我们一般删除表怎么做?
drop table tb_name;
这样删除的是将表的结构和数据,定义全部删除,立刻释放磁盘空间。删了就啥都没了。
注意!!!:
- 无法回滚
- drop table会严重的消耗服务器IO性能,如果被drop的table容量较大,甚至会影响到线上的正常。
drop容量大的table会影响线上服务原因
直接执行drop table,mysql会将表定义和表数据全都删除,包括磁盘上的物理文件,也包括buffer pool中的内存数据。 这就分两步,第一步从buffer pool中删除,这会涉及到table_cache的lock,如果持有table_cache的lock,这将导致其他查询都无法执行。这种情况在没有innodb_per_table之前尤为严重。另外,mysql5.5.23之后添加lazy drop table功能,这个功能用来解决mutex on the LRU list。其中心思想就是加锁,找到需要被删除的page,删除1024个page之后释放锁让其他thread工作,之后loop。而percona的lazy drop处理起来更优雅一些,其会先加锁,然后找到需要被删除的page,标记,释放锁,后台慢慢删除。
参考链接: https://www.cnblogs.com/zhiqian-ali/p/5339123.html
既然如此如何优雅的去解决删除大表时过慢的问题呢?
1.建立链接
ln table.ibd table.idb.hdlk
2.Mysql执行drop table操作
drop table if exists tablename;
3.使用截断删除物理文件
truncate -s 1024 * 1024 * 4 filename
删除数据
delete
我们一般用delete用的最多一些,一般用它来直接删除表中的某一行数据,同时该行的删除操作会被记录在日志中保存以便于进行回滚操作。
删除一条/多条记录
delete from tb_name where...;
删除表中所有记录
delete from tb_name;
注意!!!: 可以回滚
truncate
truncate table tb_name;
删除表全部数据,保留表结构,立刻释放磁盘空间,无法回滚。(通过释放存储表数据所用的数据页来删除数据)并不把单独的删除操作记录记入日志保存(只在事务日志中记录页的释放),因此页不能回滚,不能恢复数据,在删除的过程中不会激活与表有关的触发器,和delete from tb_name相比占用的资源更少,速度更快。数据空间会释放,这个表和索引所占的空间会恢复到初始大小。)
注意!!!:
1.无法回滚。
2.truncate只能操作没有关联视图的table,他不能用于参与了索引视图的表。