mysql—当我们需要多次运行相同的查询时,如何减少服务器上的负载,只需稍微改变一下条件

qij5mzcb  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(314)

编辑
将所有查询合并到一个select-like中是否更好 select (select...) as q1, (select...) as q2 结束编辑
我需要为一年中的每个月运行以下相同的查询。
每个查询之间的区别只是添加了一个 group by 或者消除一种症状。
第一个问题:我需要计算总访问量

SELECT 
    count(*)
from 
    visit 
where 
    visit_status='Active' 
AND 

    month(visit.date_of_visit)=month(:selectedDate)
AND
    year(visit.date_of_visit)=year(:selectedDate)

当然 :selectedDate 将由php中的绑定值设置。
第二个查询:是关于计算病人的数量(而不是就诊次数),只需添加 group by visit.patient_id ```
SELECT
count(*)
from
visit
where
visit_status='Active'
AND

    month(visit.date_of_visit)=month(:selectedDate)
AND
    year(visit.date_of_visit)=year(:selectedDate)

group by visit.patient_id

然后我会用 `rowCount` 得到的结果作为返回值是由于 `group by` .
同样的查询应该重复,但现在没有日期,这意味着从第一次在系统上注册数据开始计数:

SELECT
count(*)
from
visit
where
visit_status='Active'

group by visit.patient_id

我使用以下方法没有错误,但是有没有更好的方法来做到这一点,并通过最小化查询数量来减少服务器上的负载?
jdgnovmf

jdgnovmf1#

试试这个。

select COUNT(distinct (visit.patient_id))  from visit where  visit_status='Active'
btqmn9zl

btqmn9zl2#

假设 patient_id 永远不会 NULL ,则应将查询编写为:

select count(distinct v.patient_id)
from visit v
where v.visit_status = 'Active' and
      v.date_of_visit >= :selectedDate - interval (1 - day(:selectedDate)) day and
      v.date_of_visit < last_day(:selectedDate) + interval 1 day;

这是一种更好的编写查询的方法,特别是当您关心性能时:
这可以利用上的索引 visit(visit_status, date_of_visit, patient_id) .
你只是在返回你真正想要的——也就是说,唯一的病人的数量。
您可以删除 where 条件on date以获取所有日期。

相关问题