必须用EXCHANGE PARTITION而非INSERT…SELECT的情况是:将已构建好索引和约束的完整数据集(如日订单快照)快速接入分区表,以实现毫秒级元数据切换、避免锁表、重建索引及触发触发器。
什么情况下必须用 EXCHANGE PARTITION 而不是 INSERT ... SELECT
当你要把一个已构建好的、带索引和约束的完整数据集(比如一天的订单快照)快速接入分区表时,EXCHANGE PARTITION 是唯一能避免锁表、避免重建索引、避免触发触发器的方案。它本质是元数据切换,不移动数据文件,毫秒级完成。
常见误用是拿它替代日常 DML —— 它不是增删改查工具,而是“冷数据批量上架”或“热数据归档下线”的原子操作。
- 源表必须与目标分区有完全一致的列定义(顺序、类型、是否允许 NULL)、相同存储引擎(通常是
InnoDB)、且不能有外键引用 - 源表不能是临时表,也不能是分区表本身
- 执行前需确保源表已建好对应索引(否则交换后查询会变慢,且无法在交换过程中自动创建)
- 如果目标分区非空,交换会失败;想覆盖就得先
TRUNCATE PARTITION或DROP PARTITION
EXCHANGE PARTITION 和 ALTER TABLE ... REORGANIZE PARTITION 的分工区别
前者是“换皮”:把一个独立表的数据逻辑挂到某个分区名下;后者是“拆分/合并”:在同一个表内部重划数据边界,会实际拷贝数据并重建索引。
典型场景对比:
- 每天凌晨把
staging_orders_20240520表快速变成orders表的p20240520分区 → 用EXCHANGE - 发现按天分区太细,要把 30 个日分区合并成 1 个月分区 → 用
REORGANIZE - 想把旧分区里的部分数据挪到新分区(比如按用户 ID 重分布)→ 不能用
EXCHANGE,得走INSERT ... SELECT+DELETE
混淆这两者会导致计划外的 I/O 爆发或锁表时间远超预期。