## 主要更改 ### 1. 数据库表结构增强 - **t_device_message_v2**: 新增7个关键字段 - priority_level: 优先级数值(1-5) - channels: 分发渠道JSON - require_ack: 是否需要确认 - metadata: 扩展元数据JSON - target_count: 目标用户总数 - version: 乐观锁版本号 - **t_device_message_detail_v2**: 新增8个关键字段 - distribution_id: 分发唯一ID - device_sn: 设备序列号 - user_id: 用户ID(核心查询字段) - response_duration: 响应耗时 - delivery_details: 分发详情JSON - client_info: 客户端信息JSON - location_info: 位置信息JSON - last_retry_time: 最后重试时间 ### 2. 索引优化重构 (基于user_id) - 删除原有device_sn相关索引 - 新建5个user_id高性能复合索引: - idx_customer_user_time: 客户+用户+时间 - idx_customer_user_status: 客户+用户+状态 - idx_customer_user_type: 客户+用户+类型 - idx_user_org_priority: 用户+组织+优先级 - idx_user_status_time: 用户+状态+时间 - detail表新建4个user_id相关索引: - uk_message_user_target: 唯一约束 - idx_customer_user_status: 客户+用户+状态 - idx_user_channel_time: 用户+渠道+时间 - idx_user_delivery_status: 用户+分发状态 ### 3. 数据迁移和初始化 - 自动生成distribution_id - 根据urgency设置priority_level - 初始化默认channels配置 - 保持现有数据完整性 ### 4. 性能提升预期 - 用户消息查询: 预计10-20倍性能提升 - 确认状态查询: 支持快速人员清单检索 - 存储空间: JSON字段替代冗余VARCHAR - 查询覆盖: 所有user_id查询都能命中索引 ### 5. 文档和脚本 - 完整的V2优化SQL脚本 - 消息机制设计文档 - 数据库备份(22MB) - 性能验证查询 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]>
142 lines
5.7 KiB
SQL
142 lines
5.7 KiB
SQL
-- 健康数据处理定时任务优化SQL脚本
|
|
-- 删除旧的分散任务,添加新的统一任务
|
|
|
|
-- 1. 删除重复和过时的定时任务
|
|
DELETE FROM mon_scheduler WHERE job_name IN (
|
|
'HealthTableArchive', -- 与 MonthlyDataArchive 重复
|
|
'UserHealthBaseline', -- 替换为统一任务
|
|
'DepartmentHealthBaseline', -- 替换为统一任务
|
|
'OrgHealthBaseline', -- 替换为统一任务
|
|
'UserHealthScore', -- 替换为统一任务
|
|
'DepartmentHealthScore', -- 替换为统一任务
|
|
'OrgHealthScore', -- 替换为统一任务
|
|
'HealthRecommendation' -- 替换为统一任务
|
|
);
|
|
|
|
-- 2. 添加统一健康数据处理任务 (每日凌晨02:00执行)
|
|
INSERT INTO mon_scheduler (
|
|
id, job_name, job_group, trigger_name, trigger_group,
|
|
job_data, trigger_data, create_user, create_user_id, create_time
|
|
) VALUES (
|
|
UNIX_TIMESTAMP() * 1000 + FLOOR(RAND() * 1000000),
|
|
'UnifiedHealthProcessing',
|
|
'HealthGroup',
|
|
'UnifiedHealthProcessingTrigger',
|
|
'HealthTriggerGroup',
|
|
'[{"key":"jobClass","value":"com.ljwx.modules.health.job.UnifiedHealthProcessingJob"},{"key":"description","value":"统一健康数据处理任务(基线→评分→建议)"}]',
|
|
'[{"key":"cronExpression","value":"0 0 2 * * ?"},{"key":"description","value":"每日凌晨02:00执行统一健康数据处理"}]',
|
|
'system',
|
|
1,
|
|
NOW()
|
|
);
|
|
|
|
-- 3. 添加分步骤健康数据处理任务(用于手动或独立执行)
|
|
|
|
-- 健康基线生成任务
|
|
INSERT INTO mon_scheduler (
|
|
id, job_name, job_group, trigger_name, trigger_group,
|
|
job_data, trigger_data, create_user, create_user_id, create_time
|
|
) VALUES (
|
|
UNIX_TIMESTAMP() * 1000 + FLOOR(RAND() * 1000000),
|
|
'HealthBaselineProcessing',
|
|
'HealthGroup',
|
|
'HealthBaselineProcessingTrigger',
|
|
'HealthTriggerGroup',
|
|
'[{"key":"jobClass","value":"com.ljwx.modules.health.job.HealthBaselineProcessingJob"},{"key":"description","value":"健康基线生成任务"}]',
|
|
'[{"key":"cronExpression","value":"0 0 0 1 1 ? 2099"},{"key":"description","value":"健康基线生成任务(手动执行)"}]',
|
|
'system',
|
|
1,
|
|
NOW()
|
|
);
|
|
|
|
-- 健康评分生成任务
|
|
INSERT INTO mon_scheduler (
|
|
id, job_name, job_group, trigger_name, trigger_group,
|
|
job_data, trigger_data, create_user, create_user_id, create_time
|
|
) VALUES (
|
|
UNIX_TIMESTAMP() * 1000 + FLOOR(RAND() * 1000000),
|
|
'HealthScoreProcessing',
|
|
'HealthGroup',
|
|
'HealthScoreProcessingTrigger',
|
|
'HealthTriggerGroup',
|
|
'[{"key":"jobClass","value":"com.ljwx.modules.health.job.HealthScoreProcessingJob"},{"key":"description","value":"健康评分生成任务"}]',
|
|
'[{"key":"cronExpression","value":"0 0 0 1 1 ? 2099"},{"key":"description","value":"健康评分生成任务(手动执行)"}]',
|
|
'system',
|
|
1,
|
|
NOW()
|
|
);
|
|
|
|
-- 健康预测生成任务
|
|
INSERT INTO mon_scheduler (
|
|
id, job_name, job_group, trigger_name, trigger_group,
|
|
job_data, trigger_data, create_user, create_user_id, create_time
|
|
) VALUES (
|
|
UNIX_TIMESTAMP() * 1000 + FLOOR(RAND() * 1000000),
|
|
'HealthPredictionProcessing',
|
|
'HealthGroup',
|
|
'HealthPredictionProcessingTrigger',
|
|
'HealthTriggerGroup',
|
|
'[{"key":"jobClass","value":"com.ljwx.modules.health.job.HealthPredictionProcessingJob"},{"key":"description","value":"健康预测生成任务"}]',
|
|
'[{"key":"cronExpression","value":"0 0 0 1 1 ? 2099"},{"key":"description","value":"健康预测生成任务(手动执行)"}]',
|
|
'system',
|
|
1,
|
|
NOW()
|
|
);
|
|
|
|
-- 健康建议生成任务
|
|
INSERT INTO mon_scheduler (
|
|
id, job_name, job_group, trigger_name, trigger_group,
|
|
job_data, trigger_data, create_user, create_user_id, create_time
|
|
) VALUES (
|
|
UNIX_TIMESTAMP() * 1000 + FLOOR(RAND() * 1000000),
|
|
'HealthRecommendationProcessing',
|
|
'HealthGroup',
|
|
'HealthRecommendationProcessingTrigger',
|
|
'HealthTriggerGroup',
|
|
'[{"key":"jobClass","value":"com.ljwx.modules.health.job.HealthRecommendationProcessingJob"},{"key":"description","value":"健康建议生成任务"}]',
|
|
'[{"key":"cronExpression","value":"0 0 0 1 1 ? 2099"},{"key":"description","value":"健康建议生成任务(手动执行)"}]',
|
|
'system',
|
|
1,
|
|
NOW()
|
|
);
|
|
|
|
-- 健康档案生成任务
|
|
INSERT INTO mon_scheduler (
|
|
id, job_name, job_group, trigger_name, trigger_group,
|
|
job_data, trigger_data, create_user, create_user_id, create_time
|
|
) VALUES (
|
|
UNIX_TIMESTAMP() * 1000 + FLOOR(RAND() * 1000000),
|
|
'HealthProfileProcessing',
|
|
'HealthGroup',
|
|
'HealthProfileProcessingTrigger',
|
|
'HealthTriggerGroup',
|
|
'[{"key":"jobClass","value":"com.ljwx.modules.health.job.HealthProfileProcessingJob"},{"key":"description","value":"健康档案生成任务"}]',
|
|
'[{"key":"cronExpression","value":"0 0 0 1 1 ? 2099"},{"key":"description","value":"健康档案生成任务(手动执行)"}]',
|
|
'system',
|
|
1,
|
|
NOW()
|
|
);
|
|
|
|
-- 保留必要的任务:
|
|
-- WeightConfigValidation (权重配置验证) - 01:00
|
|
-- MonthlyDataArchive (月度数据归档) - 每月1日00:00
|
|
-- HealthDataCleanup (数据清理) - 05:00
|
|
|
|
-- 查看优化后的任务列表
|
|
SELECT
|
|
job_name,
|
|
job_group,
|
|
JSON_EXTRACT(job_data, '$[1].value') as description,
|
|
JSON_EXTRACT(trigger_data, '$[0].value') as cron_expression,
|
|
create_time
|
|
FROM mon_scheduler
|
|
WHERE job_group = 'HealthGroup'
|
|
ORDER BY
|
|
CASE
|
|
WHEN JSON_EXTRACT(trigger_data, '$[0].value') = '0 0 1 * * ?' THEN 1 -- 01:00
|
|
WHEN JSON_EXTRACT(trigger_data, '$[0].value') = '0 0 2 * * ?' THEN 2 -- 02:00
|
|
WHEN JSON_EXTRACT(trigger_data, '$[0].value') = '0 0 5 * * ?' THEN 3 -- 05:00
|
|
WHEN JSON_EXTRACT(trigger_data, '$[0].value') = '0 0 0 1 * ?' THEN 4 -- 每月1日
|
|
ELSE 5
|
|
END,
|
|
job_name; |