医生排班查询性能优化咨询 现有date/day二选一的schedules模型
排班查询性能优化方案
方案1:单次数据库查询合并逻辑(无需修改现有表结构)
你现有的两次查询逻辑可以直接合并为单条SQL完成,完全兼容当前date/day二选一的表设计,核心逻辑是同时拉取日期匹配、星期匹配的有效排班,给日期调整的排班更高优先级,同医生的排班只保留优先级最高的条目,自动覆盖周度固定排班。
以PostgreSQL为例,查询2021-07-19(周一)排班的语句如下:
WITH ranked_schedules AS ( SELECT *, -- 日期调整排班优先级高于周度固定排班 ROW_NUMBER() OVER ( PARTITION BY doctor_id ORDER BY CASE WHEN date = '2021-07-19' THEN 1 ELSE 2 END ASC ) AS rank_num FROM schedules WHERE status = 'active' AND (date = '2021-07-19' OR day = '周一') ) SELECT * FROM ranked_schedules WHERE rank_num = 1;
如果使用MySQL,也可以用子查询+分组的方式实现,前提是schedules表包含关联医生的doctor_id字段,若排班还关联科室、门诊类型等维度,把PARTITION BY对应的字段加上即可。
方案2:表结构优化进一步提升性能
如果查询量级较大,可以做两个小改动进一步提速:
- 新增
schedule_type枚举字段,标记是weekly(周度固定)还是adjustment(日期调整),避免查询时的CASE判断 - 给
(date, status)、(day, status)建联合索引,命中索引后查询耗时可以降低50%以上
方案3:缓存层兜底(高并发场景适用)
如果业务高峰查询QPS很高,可以加Redis缓存层:
- 周度固定排班按星期维度缓存,有效期可以设为7天
- 日期调整排班按日期维度缓存,有调整操作时主动更新缓存
查询时优先取对应日期的调整排班缓存,不存在的话再取对应星期的周度排班缓存,完全不需要查数据库,性能提升最明显。
内容的提问来源于stack exchange,提问作者Shahid Kamal
相关产品推荐
相关产品推荐

