TRUNCATE PARTITION 是唯一安全高效清空单个分区的方式,仅重置段指针、不逐行删除、不影响其他分区;需确保分区类型兼容、版本≥5.7、显式指定分区名,并检查外键依赖与分区数据准确性。

TRUNCATE PARTITION 语句是唯一安全清空单个分区的方式
MySQL 不支持 DELETE 按分区条件高效清理(即使加了 PARTITION hint,仍可能锁全表或走全表扫描),而 TRUNCATE PARTITION 是原子性操作,仅重置目标分区的段指针,不走逐行删除逻辑,速度极快且不影响其他分区的数据和索引结构。
使用前必须确认:表使用的是 RANGE、LIST 或 HASH 分区(KEY 也可),且 MySQL 版本 ≥ 5.7(8.0 更稳定);TRUNCATE PARTITION 不适用于子分区(subpartition)。
-
TRUNCATE TABLE tbl_name PARTITION (p0)—— 清空名为p0的分区 - 可一次清空多个:
TRUNCATE TABLE tbl_name PARTITION (p1, p2, p3) - 不能用通配符或表达式,分区名必须显式写出,可通过
SELECT PARTITION_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'tbl_name'查询 - 该操作会重置该分区的自增计数器(如果该分区有独立的 AUTO_INCREMENT 值,如 RANGE 分区中某分区为最大值区间)
误用 DELETE + PARTITION hint 导致全表扫描和长事务
有人尝试写 DELETE FROM tbl_name PARTITION (p0) WHERE 1=1,但这是无效语法;MySQL 实际接受的是 DELETE FROM tbl_name PARTITION (p0)(无 WHERE),但它**并不等价于 TRUNCATE**:它仍会逐行标记删除、生成 undo log、触发 binlog event,并可能因未走分区裁剪而扫描全表——尤其当查询优化器无法确定分区边界时。
- 执行
EXPLAIN PARTITIONS可验证是否真正只访问目标分区 -
DELETE在大分区上可能持续数分钟甚至更久,期间持有 S 锁或 X 锁,阻塞其他 DML - binlog 中记录为多条
DELETE事件,主从延迟风险高;而TRUNCATE PARTITION在 binlog 中只记一条 DDL 事件(需binlog_format=ROW或MIXED才能安全复制)
清空前必须检查外键和从属对象依赖
TRUNCATE PARTITION 虽不校验外键约束(不像 TRUNCATE TABLE 会直接报错),但如果该分区表被其他表通过外键引用,且引用列值存在于该分区中,后续插入/更新可能违反参照完整性——因为 TRUNCATE PARTITION 不触发级联动作。
- 检查是否有外键指向该表:
SELECT CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_NAME = 'tbl_name' - 确认该分区中是否存在被引用的主键/唯一键值(特别是
RANGE分区中靠近边界的数据) - 视图、存储过程、触发器本身不受影响,但若其逻辑硬编码了分区名(如拼接
'p' + YEAR(NOW())),清空后需人工验证逻辑是否仍成立
清空 HASH/LIST 分区比 RANGE 更需谨慎核对分区名
RANGE 分区名通常有业务含义(如 p2023, p2024),容易识别;而 HASH 或 LIST 分区名默认是 p0, p1… 这类编号极易看错。一旦误删 p1 实际想删的是 p10,恢复成本极高。
- 执行前务必用
SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'tbl_name' ORDER BY PARTITION_ORDINAL_POSITION查看真实行数分布 - 对
HASH表,用SELECT * FROM tbl_name PARTITION (p5)抽样几条数据,确认其字段值符合预期分区逻辑(比如哈希字段值 % 8 == 5) - 生产环境建议加
--dry-run风格的预检:先在测试库还原同结构+同数据量,跑一遍TRUNCATE看效果
清空分区不是“删数据”而是“换元数据指针”,所以快得反常,也意味着没留后悔药——没备份、没核对分区名、没确认外键关系,三者任一缺失,都可能导致线上数据逻辑断裂。


















