You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化单SQL查询获取患者的上下次预约日期?

优化预约日期查询的方案

嘿,你的思路没问题,原查询确实能实现需求,但两次子查询会导致数据库对同一张表做两次过滤扫描,当数据量变大时性能会打折扣。这里有几个更高效的优化方案,既能保持逻辑一致,又能减少表访问次数:

方案一:条件聚合(单次表扫描)

用条件聚合的方式,只需要扫描一次目标患者的预约记录,就能同时计算出上一次和下一次预约日期:

SELECT
  MIN(CASE WHEN date >= NOW() THEN date END) AS next_appointment,
  MAX(CASE WHEN date < NOW() THEN date END) AS last_appointment
FROM appointments
WHERE patient_id = '1';

原理说明:

  • 首先通过WHERE patient_id = '1'筛选出该患者的所有预约记录,只做一次表过滤
  • 用CASE语句分别标记出未来和过去的预约日期,再通过MIN和MAX分别提取最早的未来日期(下一次)和最晚的过去日期(上一次)
  • 如果患者没有未来/过去的预约,对应字段会返回NULL,和原查询的行为完全一致

方案二:搭配高效索引(关键优化点)

不管用哪种查询语句,合适的索引都是提升性能的核心。针对这个查询场景,创建复合索引可以让数据库直接定位到目标数据,避免全表扫描:

CREATE INDEX idx_appointments_patient_date ON appointments (patient_id, date);

索引作用:

这个索引会先按patient_id分组,再按date排序,数据库可以快速找到指定患者的所有预约记录,并且不需要额外排序就能直接获取MIN/MAX值,不管是原查询还是优化后的查询都能大幅提速。

性能对比

  • 原查询:两次独立子查询,需要两次过滤patient_id='1'和日期条件,相当于两次表扫描(或索引扫描)
  • 优化后的条件聚合查询:仅需一次扫描目标患者的记录,减少了IO开销,在数据量较大的场景下性能提升明显

内容的提问来源于stack exchange,提问作者Ragnar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:44:21