1. 核心概念

这三个命令都用于删除数据,但它们的操作对象、执行原理和后果截然不同。

  • DELETE:DML 语句,用于删除表中的(可带 WHERE 条件)。
  • TRUNCATE:DDL 语句,用于清空整张表的数据,但保留表结构。
  • DROP:DDL 语句,用于删除整张表(数据 + 结构)。

2. 详细对比

2.1 执行原理

  1. DELETE
    • 机制:逐行删除。InnoDB 会将每一行标记为“已删除”,但不会立即释放磁盘空间(留作复用)。
    • 事务:属于 DML,支持事务回滚
    • 触发器会触发 ON DELETE 触发器。
    • 性能:最慢。因为要记录大量的 Undo Log 和 Redo Log。
  2. TRUNCATE
    • 机制:本质是“销毁原表,重建新表”。它直接丢弃数据页,不逐行扫描。
    • 事务:属于 DDL,隐式提交,不可回滚
    • 触发器不会触发 任何触发器。
    • 自增列:会将 AUTO_INCREMENT 计数器重置为 1。
    • 性能:极快。
  3. DROP
    • 机制:直接删除表定义文件(.frm)和数据文件(.ibd)。
    • 事务:属于 DDL,不可回滚
    • 性能:最快。

3. 总结与选择

特性 DELETE TRUNCATE DROP
类型 DML (数据操作) DDL (数据定义) DDL (数据定义)
回滚 ✅ 支持 ❌ 不支持 ❌ 不支持
条件 支持 WHERE 不支持 不支持
速度 慢 (逐行) 快 (重建) 最快 (文件级)
空间释放 不一定 (产生碎片) 立即释放 立即释放
自增 ID 保持原值 重置为 1 消失

面试回答示例: “如果想删除部分数据,用 DELETE。 如果想保留表结构但清空所有数据,且不需要回滚,用 TRUNCATE,它比 Delete 快得多且会重置自增 ID。 如果表彻底不要了,连结构都删掉,用 DROP。”