日期:2026-09-27
标签:#面试 #MySQL #数据库
难度:中等
来源:牛面 MySQL 题库
答案说明:独立整理(站内题目标记为 VIP,未读取会员答案)
一句话答案
DELETE删行,TRUNCATE清空表,DROP移除表对象;三者在过滤能力、事务语义和结构保留上不同。
面试口语版(约 60 秒)
DELETE 是可带 WHERE 的行级 DML;在 InnoDB 事务中未提交的删除可以回滚。TRUNCATE TABLE 清空整表、保留表定义,属于会隐式提交的 DDL,不能像 DELETE 那样在用户事务中回滚。DROP TABLE 连表定义一起移除。选法由是否保留结构、是否按条件删除、能否回滚和外键依赖决定。
原理拆解与场景
START TRANSACTION;
DELETE FROM audit_log WHERE created_at < '2025-01-01';
-- 检查影响行数;确认后提交,否则改为 ROLLBACK
COMMIT;
TRUNCATE TABLE staging_events; -- 清空暂存表,DDL 隐式提交
DROP TABLE obsolete_import; -- 移除不再需要的表对象
大批量历史删除可按主键范围分批并观察锁、复制延迟和 undo/redo 压力;清空独立暂存表可考虑 TRUNCATE。
关键边界与工程取舍
TRUNCATE 不触发 DELETE 触发器,受外键引用限制,且通常重置 AUTO_INCREMENT。MySQL 8.4 的 InnoDB 原子 DDL 可保证崩溃时该 DDL 整体完成或回退,但这不等于执行后用户可用 ROLLBACK 撤销。DROP/TRUNCATE 前还要检查备份、权限、复制与误操作恢复路径。
面试官递进追问
1. 哪一种能带 WHERE?
参考答案: 只有 DELETE 能带 WHERE 按条件删行;不写 WHERE 的 DELETE 也会删除全部行,但仍是 DML。TRUNCATE TABLE 用于清空整张表且保留定义,DROP TABLE 则移除表对象,两者都不能加 WHERE。在 InnoDB 显式事务中,尚未提交的 DELETE 可以回滚;开启自动提交并已成功执行后,也不能靠另发 ROLLBACK 恢复。选择时要先确认删哪些数据、是否保留结构及恢复要求。
2. 为什么 TRUNCATE 的“原子 DDL”不代表事务可回滚?
参考答案: “原子 DDL”保障的是一条 DDL 涉及的数据字典、引擎操作和 binlog 在正常执行或崩溃恢复后保持整体一致:要么完成,要么撤回未完成操作。它不是允许用户把 DDL 纳入任意事务再决定提交。TRUNCATE 会隐式提交,已经完成后执行 ROLLBACK 不能恢复原数据,甚至此前同一会话尚未提交的 DML 也可能已被提交。因此误清空后的恢复依赖备份和适当的时间点恢复流程,而不是事务回滚。MySQL 原子 DDL
3. 在线清理亿级历史数据如何控制锁与复制延迟?
参考答案: 先确认保留期限和归档可用,再用索引定位过期记录,按稳定主键游标或主键区间做小批删除,每批独立提交并保存进度;删除时再次带上过期条件,防止并发修改后误删。批量大小从压测结果出发,根据每批耗时、锁等待、redo/undo 压力和副本应用延迟动态调节,超阈值就降速或暂停。要排查长事务阻碍 purge,避免 OFFSET 扫描和一个超大事务拖住恢复。已有按时间分区且整段过期时,可评估删分区,但它仍涉及 DDL、元数据锁和业务边界;普通 DELETE 后空间也不一定立即归还操作系统。
自测
- 合上笔记,用 60 秒复述一句话结论、一个例子和一个边界。
- 完成第 3 个追问,写出你会核对的 SQL、指标或故障证据。
延伸阅读
参考资料
以 MySQL 8.4 为版本基准;官方资料核对日期:2026-09-27。