1. 核心概念
这三个命令都用于删除数据,但它们的操作对象、执行原理和后果截然不同。
- DELETE:DML 语句,用于删除表中的行(可带 WHERE 条件)。
- TRUNCATE:DDL 语句,用于清空整张表的数据,但保留表结构。
- DROP:DDL 语句,用于删除整张表(数据 + 结构)。
2. 详细对比
2.1 执行原理
- DELETE
- 机制:逐行删除。InnoDB 会将每一行标记为“已删除”,但不会立即释放磁盘空间(留作复用)。
- 事务:属于 DML,支持事务回滚。
- 触发器:会触发
ON DELETE触发器。 - 性能:最慢。因为要记录大量的 Undo Log 和 Redo Log。
- TRUNCATE
- 机制:本质是“销毁原表,重建新表”。它直接丢弃数据页,不逐行扫描。
- 事务:属于 DDL,隐式提交,不可回滚。
- 触发器:不会触发 任何触发器。
- 自增列:会将
AUTO_INCREMENT计数器重置为 1。 - 性能:极快。
- DROP
- 机制:直接删除表定义文件(.frm)和数据文件(.ibd)。
- 事务:属于 DDL,不可回滚。
- 性能:最快。
3. 总结与选择
| 特性 | DELETE | TRUNCATE | DROP |
|---|---|---|---|
| 类型 | DML (数据操作) | DDL (数据定义) | DDL (数据定义) |
| 回滚 | ✅ 支持 | ❌ 不支持 | ❌ 不支持 |
| 条件 | 支持 WHERE | 不支持 | 不支持 |
| 速度 | 慢 (逐行) | 快 (重建) | 最快 (文件级) |
| 空间释放 | 不一定 (产生碎片) | 立即释放 | 立即释放 |
| 自增 ID | 保持原值 | 重置为 1 | 消失 |
面试回答示例: “如果想删除部分数据,用 DELETE。 如果想保留表结构但清空所有数据,且不需要回滚,用 TRUNCATE,它比 Delete 快得多且会重置自增 ID。 如果表彻底不要了,连结构都删掉,用 DROP。”