Truncate是啥?一篇文章带你一起了解。

Truncate是啥?一篇文章带你一起了解。

DROP-删除表

我们一般删除表怎么做?

drop table tb_name;

这样删除的是将表的结构和数据,定义全部删除,立刻释放磁盘空间。删了就啥都没了。
注意!!!:

  1. 无法回滚
  2. 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

参考博客: https://blog.csdn.net/demonson/article/details/80432438?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2aggregatepagefirst_rank_ecpm_v1~rank_aggregation-15-80432438.pc_agg_rank_aggregation&utm_term=Mysql+drop+table+%E5%8E%9F%E7%90%86&spm=1000.2123.3001.4430

删除数据

delete

我们一般用delete用的最多一些,一般用它来直接删除表中的某一行数据,同时该行的删除操作会被记录在日志中保存以便于进行回滚操作。
删除一条/多条记录

 delete from tb_name where...;

删除表中所有记录

 delete from tb_name;

注意!!!: 可以回滚

delete的原理详解请参考: https://blog.csdn.net/weixin_42508905/article/details/113170525?utm_term=Mysql%E5%88%A0%E9%99%A4%E6%95%B0%E6%8D%AE%E7%9A%84%E5%8E%9F%E7%90%86&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allsobaiduweb~default-1-113170525&spm=3001.4430

truncate

truncate table tb_name;

删除表全部数据,保留表结构,立刻释放磁盘空间,无法回滚。(通过释放存储表数据所用的数据页来删除数据)并不把单独的删除操作记录记入日志保存(只在事务日志中记录页的释放),因此页不能回滚,不能恢复数据,在删除的过程中不会激活与表有关的触发器,和delete from tb_name相比占用的资源更少,速度更快。数据空间会释放,这个表和索引所占的空间会恢复到初始大小。)
注意!!!:
1.无法回滚。
2.truncate只能操作没有关联视图的table,他不能用于参与了索引视图的表。

上一篇:同事删库跑路后,我连表名都不能修改了?


下一篇:Mysql中Truncate用法详解