You need to enable JavaScript to run this app. 医生排班查询性能优化咨询 现有date/day二选一的schedules模型
优惠活动
大模型
产品
解决方案
定价
更多

医生排班查询性能优化咨询 现有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 17:12:02