最稳妥的冷热分离起点是PARTITION BY RANGE,但需满足主键含分区键、innodb_file_per_table=ON且不支持跨服务器迁移;DROP PARTITION快因是DDL操作,不走事务日志、无undo/redo、不触发索引维护和触发器。

直接用 PARTITION BY RANGE 是最稳妥的冷热分离起点,但必须满足主键包含分区键、innodb_file_per_table=ON、且不能跨服务器迁移数据这几个硬条件。
为什么 DROP PARTITION 比 DELETE FROM ... WHERE 快得多
因为 DROP PARTITION 是 DDL 操作,不走事务日志,不生成 undo/redo,也不触发索引维护和触发器。而 DELETE 在大表上会:锁整张表(或大量页)、撑爆 buffer pool、产生巨量 binlog、拖慢主从同步。
- 实操建议:归档周期明确(如只保留最近 12 个月),就优先建 RANGE 分区,每月一个分区,过期分区用
ALTER TABLE t DROP PARTITION p_202503 - 注意:
TO_DAYS()或YEAR()函数在分区表达式中要确保单调、确定、无 NULL —— 否则建表会失败或后续无法裁剪 - 验证是否生效:执行
EXPLAIN PARTITIONS SELECT * FROM orders WHERE create_time ,看partitions列是否只显示冷分区名
PRIMARY KEY 必须包含分区键,否则建表或修改会报错
MySQL 要求:如果表有主键或唯一索引,那么分区键必须是该索引的一部分。这是硬性约束,不是建议。
解析 MySQL 8.0 的 DDL 脚本,并将表结构导出为 Excel 格式。适用于用户需将 MySQL 的 `CREATE TABLE` 语句转换为结构化的 Excel 文件场景,导出内容包含字段名、数据类型、长度及精度等信息。支持多张表的批量处理,每张表对应 Excel 中的一个独立工作表。适用于数据库文档编写、数据字典生成及模式分析等任务。
- 常见错误现象:
ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function - 解决步骤:先
ALTER TABLE t DROP PRIMARY KEY(若含自增需一并处理),再ADD PRIMARY KEY(id, create_time),最后才能加分区 - 别图省事用
id单字段主键——它会导致按时间查询时无法分区裁剪,等于白分
归档到独立表时,INSERT INTO ... SELECT 必须配 LIMIT + WHERE 条件索引
一次性迁移百万级冷数据,容易打满磁盘 IO、耗尽内存、阻塞线上写入。即使目标是归档表,也得当线上操作对待。
- 必须确保
WHERE条件字段(如create_time )上有有效索引,否则变成全表扫描 - 每次最多搬 5000 行:
INSERT INTO orders_archived SELECT * FROM orders WHERE create_time - 删数据也得分批:
DELETE FROM orders WHERE create_time ,并循环直到影响行为 0 - 务必在从库验证逻辑正确性后再跑主库;监控
SHOW PROCESSLIST和SHOW ENGINE INNODB STATUS中的事务等待
最容易被忽略的是分区表的物理路径管理——innodb_file_per_table=OFF 时所有分区共用一个 ibdata1,删分区不释放空间;冷分区迁移到 HDD 前,必须确认表空间已独立,且目标路径有足够权限和容量。










