truncate、delete、drop的区别?
DELETE 语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。
TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。
DROP语句将表所占用的空间全释放掉。
在速度上,一般来说,drop> truncate > delete。
如果想删除部分数据用 delete,注意带上 where 子句,回滚段要足够大;
如果想删除表,当然用 drop; 如果想保留表而将所有数据删除,如果和事务无关,用 truncate 即可;
如果和事务有关,或者想触发 trigger,还是用 delete;
如果是整理表内部的碎片,可以用 truncate 跟上 reuse stroage,再重新导入/插入数据
整理表内部的碎片
| 方法 | 实现原理 | 操作流程 / 示例 | 优缺点 | 适用场景 |
|---|---|---|---|---|
| TRUNCATE + INSERT | 删除表数据页,重建表结构;InnoDB 会重用原来分配的页 | sql -- 备份表 CREATE TABLE t_backup AS SELECT * FROM t; -- 清空表 TRUNCATE TABLE t; -- 重新插入数据 INSERT INTO t SELECT * FROM t_backup; |
快速、简单;但会隐式提交事务,删除数据风险大 | 小表 / 可停机维护 |
| OPTIMIZE TABLE | InnoDB 创建临时表,将原表数据复制过去 → 连续页存储 → 删除原表 → 重命名临时表 | sql OPTIMIZE TABLE t; |
无需手动备份,操作简单;大表占用临时空间多 | 中小表、定期维护 |
| pt-online-schema-change | 在线重建表 → 数据复制到新表 → 最后切换表名 | bash pt-online-schema-change --alter "ENGINE=InnoDB" D=mydb,t=t --execute |
不锁表,在线整理大表;需要额外工具 | 大表、在线环境 |