news 2026/4/23 17:17:13

【作业2】DELETE vs TRUNCATE 区别及大表删除影响

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【作业2】DELETE vs TRUNCATE 区别及大表删除影响

文章目录

    • 【作业2】DELETE vs TRUNCATE 区别及大表删除影响
      • 1. 二者的区别
      • 2. 大表删除表数据,对OS的影响?
        • 使用 DELETE 删除大表的影响:
        • 使用 TRUNCATE 删除大表的影响:
      • 3. 大表数据删除的最佳实践
        • 方案1:分批删除 (推荐)
        • 方案2:创建新表替换
        • 方案3:分区表删除
        • 方案4:优化TRUNCATE
      • 4. 预防措施和监控
        • 执行前检查:
        • 执行中监控:
        • OS层面监控:
      • 5. 特殊情况处理
        • 有外键约束的表:
        • InnoDB优化:
      • 总结对比表

【作业2】DELETE vs TRUNCATE 区别及大表删除影响


1. 二者的区别

特性DELETE FROM table;TRUNCATE table;
SQL 类型DML (数据操作语言)DDL (数据定义语言)
执行方式逐行删除,记录每一行的删除日志直接删除数据页,不记录行级日志
事务支持可回滚 (ROLLBACK)大部分情况下不可回滚 (MariaDB中部分版本支持事务性TRUNCATE)
触发器触发DELETE触发器不触发任何触发器
自增ID不重置自增计数器重置自增计数器为初始值
性能慢 (逐行操作)极快 (直接操作数据页)
锁机制行级锁 (InnoDB) 或 表级锁表级锁
空间释放不立即释放磁盘空间立即释放磁盘空间
WHERE子句支持条件删除不支持,只能全表清空
返回值返回删除的行数返回0 (表示成功)

2. 大表删除表数据,对OS的影响?

使用 DELETE 删除大表的影响:
影响点具体表现
事务日志暴增MariaDB会产生大量Undo/Redo日志,可能导致/var/lib/mysql空间耗尽
锁竞争长时间持有行锁/表锁,阻塞其他查询,可能导致"Waiting for table metadata lock"
CPU/内存高负载逐行删除需要解析、写入日志、更新索引,消耗大量CPU和内存
I/O 压力大大量读写操作:读取数据页→写入Undo日志→更新数据页→写入Redo日志
主从延迟二进制日志包含大量DELETE语句,从库需逐行执行,复制延迟严重
回滚灾难如果中途终止或回滚,回滚时间可能比删除时间更长
使用 TRUNCATE 删除大表的影响:
影响点具体表现
瞬间I/O峰值立即释放大量磁盘空间,文件系统需更新元数据,产生短暂I/O冲击
文件系统碎片释放大量不连续空间,可能导致磁盘碎片增加(对SSD影响较小)
缓存冲击Buffer Pool中的相关数据页立即失效,可能影响后续查询性能
磁盘空间释放延迟在InnoDB中,如果innodb_file_per_table=OFF,空间不会立即归还OS

3. 大表数据删除的最佳实践

方案1:分批删除 (推荐)
-- 使用LIMIT分批删除,减轻事务压力DELETEFROMlarge_tableWHEREconditionLIMIT1000;-- 循环执行,直到删除完成
方案2:创建新表替换
-- 1. 创建新表(保留需要的数据结构)CREATETABLEnew_tableLIKElarge_table;-- 2. 插入需要保留的数据INSERTINTOnew_tableSELECT*FROMlarge_tableWHEREkeep_condition;-- 3. 重命名表(快速切换)RENAMETABLElarge_tableTOold_table,new_tableTOlarge_table;-- 4. 稍后删除旧表DROPTABLEold_table;
方案3:分区表删除
-- 如果表已分区,直接删除分区ALTERTABLElarge_tableDROPPARTITIONp2023;-- 比删除数据快几个数量级
方案4:优化TRUNCATE
-- 1. 降低影响,在低峰期执行SETSESSIONlock_wait_timeout=300;SETSESSIONinnodb_lock_wait_timeout=300;-- 2. 使用TRUNCATETRUNCATETABLElarge_table;

4. 预防措施和监控

执行前检查:
-- 1. 评估表大小SELECTtable_nameAS`表名`,ROUND(((data_length+index_length)/1024/1024),2)AS`大小(MB)`FROMinformation_schema.tablesWHEREtable_schema='your_database'ANDtable_name='large_table';-- 2. 检查锁等待时间SHOWVARIABLESLIKE'innodb_lock_wait_timeout';SHOWVARIABLESLIKE'lock_wait_timeout';
执行中监控:
-- 监控删除进度SHOWPROCESSLIST;SHOWENGINEINNODBSTATUS\G-- 监控空间使用SELECTtable_schemaAS'数据库',table_nameAS'表名',ROUND(((data_length+index_length)/1024/1024),2)AS'当前大小(MB)'FROMinformation_schema.tablesORDERBY(data_length+index_length)DESC;
OS层面监控:
# 监控磁盘空间df-h /var/lib/mysql# 监控I/O压力iostat -x1# 监控内存和CPUtop-u mysqlhtop

5. 特殊情况处理

有外键约束的表:
-- 1. 禁用外键检查SETFOREIGN_KEY_CHECKS=0;-- 2. 执行删除TRUNCATETABLEparent_table;TRUNCATETABLEchild_table;-- 3. 重新启用SETFOREIGN_KEY_CHECKS=1;
InnoDB优化:
-- 调整Buffer Pool,减少刷盘频率SETGLOBALinnodb_flush_log_at_trx_commit=2;SETGLOBALsync_binlog=0;-- 执行删除操作-- ...-- 恢复设置SETGLOBALinnodb_flush_log_at_trx_commit=1;SETGLOBALsync_binlog=1;

总结对比表

场景推荐方法理由
小表清空TRUNCATE快速、干净
大表清空创建新表替换对业务影响最小
条件删除DELETE分批可控、可监控
分区表DROP PARTITION秒级完成
开发环境TRUNCATE快速重置
生产环境分批DELETE或新表替换稳定性优先
紧急清空TRUNCATE最快见效

核心建议:生产环境大表删除,优先考虑分批DELETE新表替换方案,避免使用一次性TRUNCATE或DELETE,除非在明确维护窗口且评估过风险。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 13:58:47

AI文学影像创意深化:从概念到洞见

一、创意深化的本质 1.1 什么是"深化"? 三个层次的理解 表层创意(What)↓ 深层创意(Why)↓ 元层创意(What does it reveal)但这还不够深。真正的深化是: 个人经验↓ 普…

作者头像 李华
网站建设 2026/4/23 10:48:59

Java全栈开发面试实战:从基础到微服务的深度技术对话

Java全栈开发面试实战:从基础到微服务的深度技术对话 一、开场白 面试官:你好,我是今天的面试官,很高兴见到你。请先简单介绍一下自己。 应聘者:您好,我叫李明,25岁,本科毕业于清华大…

作者头像 李华
网站建设 2026/4/23 12:15:17

基于python+vue的汽车租赁在线租车网站系统-pycharm DJANGO FLASK

文章目录技术栈与框架选择核心功能模块系统架构设计关键代码示例(Django)部署与扩展注意事项大数据系统开发流程主要运用技术介绍源码文档获取定制开发/同行可拿货,招校园代理 :文章底部获取博主联系方式!技术栈与框架选择 Pytho…

作者头像 李华
网站建设 2026/4/23 10:48:08

新华网×赛迪网双重肯定:销售易AI CRM入选“AI中国”生态范式集

12月3日,由新华网、赛迪网联合举办的2025企业家博鳌论坛“人工智能”生态范式论坛上,销售易AI CRM——NeoAgent凭借在AI技术应用上的卓越表现与业务实践,成功入选《“AI中国”生态范式集(2025)》和《“AI中国”生态图谱…

作者头像 李华