📌 工作原理
MySQL 原生 PARTITION BY RANGE,按 createdAt 月份分区。
查询某月数据只扫该分区(快 5-10x),删除老数据用 DROP PARTITION(瞬间)。
应用层零改动,Sequelize 自动走分区路由。
📌 已分区的表(6 张):
| 表名 | 分区字段 | 用途 |
| orders | createdAt | 订单(月增长大) |
| messages | createdAt | 客服消息(写入大) |
| kb_match_logs | createdAt | KB 匹配日志 |
| ai_call_logs | createdAt | AI 调用日志 |
| ai_routing_logs | createdAt | 路由日志 |
| page_views | created_at | 页面访问(SEO 数据) |
📌 cron 配置(推荐):
# 每天凌晨 2 点跑维护
0 2 * * * curl -X POST -H "Authorization: Bearer $ADMIN_TOKEN" \
https://api.clawhas.com/api/admin/sharding/maintenance \
-d '{"months_ahead":3,"retention_months":24}'
⚠️ 重要提示:
- 已有数据的表 ALTER 加分区会很慢(取决于数据量),建议低峰期跑
- 主键必须包含分区字段(MySQL 限制),已在 schema 中加 (id, createdAt)
- 大表迁移可用 pt-online-schema-change(Percona Toolkit)无锁
- p_future 永远存在,接收尚未分配分区的数据