标签:回滚 Truncate 一篇 删除 drop 文章 table tb delete
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,他不能用于参与了索引视图的表。
标签:回滚,Truncate,一篇,删除,drop,文章,table,tb,delete 来源: https://blog.csdn.net/weixin_43963616/article/details/120361743
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。