我们正在运行一个基于Web的医院系统,用PHP创建。由于数据库规模较小,系统最初很快,但现在变得很慢。
以下是示例查询
select pa.id, pa.date as date, pa.visitno, pa.receiptno, pa.debitnoteno, pad.id as padid,
pad.serviceid as serviceid, pad.waitno, pa.paytype, s.id as doctorid, s.fullname as
doctorname, p.id as patientid, p.name as patient, p.regno, p.age, p.gender, p.doc,
p.department, p.telno, p.address, pa.ins_prov_id, ip.name as provider,
pa.sicksheet_billcode as billcode, ds.id as serviceid, ds.name as servicename, ds.departid
as departid, ds.servicetype as servicetype, pad.charge, pad.status as status, ts.id as
timeslotid, ts.name as timeslot, pad.treatment, sd.anesthesiologist, sd.hospitalcharge,
sd.anesthcharge from patientappointments as pa
INNER JOIN patientappdetails as pad ON pa.id = pad.patappid
INNER JOIN patients as p ON pa.patid = p.id
INNER JOIN staffs as s ON pad.doctorid = s.id
LEFT JOIN departmentalservices as ds ON pad.serviceid = ds.id
LEFT JOIN insproviders as ip ON pa.ins_prov_id = ip.id
LEFT JOIN timeslots as ts ON pad.timeslotid = ts.id
LEFT JOIN surgerydetails as sd ON sd.appdetid = pad.id
where 1 = 1 and pa.date >= '01.Jul.2012' and ds.departgroupid = 16 and pad.charge != 0
正如您可以看到我们的查询大小(称之为未优化),其中显示了患者,医生,服务,时间以及他来自哪家公司。所以现在我们创建的索引在一段时间内有所帮助,但现在速度又变慢了。在localhost上运行系统会导致大约15秒的结果在实时系统上显示,超时。
您能否提出任何提高速度的方法以及确切的实施方法。
仅供参考,每个表格中的行如下:
谢谢
答案 0 :(得分:1)
通常情况下,如果您有很多联接,特别是在加入大量记录时(每个患者对医生/工作人员的详细信息和类似情况的预约),单独获取这些记录并在外面加入它们是有意义的SQL服务器 - 在应用程序服务器上
我建议一次获取医生/员工/部门服务(可能是提供者)的详细信息,并将它们存储在应用程序服务器上的应用程序缓存中。然后,您的SQL查询只需要获取患者和约会的详细信息,这将导致结果集更小(更短的记录)。
考虑到您的选择大小(我假设它是某种报告功能),您应该考虑分页和/或批处理。
答案 1 :(得分:1)
好吧,让我们从索引开始吧。 我假设你已经为patienappointments.date创建了一个索引,这是一个集群类型的索引。我还假设你有一个关于ds.departgroupid的索引。 你错过了几张桌子的大小,但我会猜测那些左边的连接是罪魁祸首。 查询执行计划应该产生一些有趣的结果(如果你可以在这里发布它可能有助于消除一些疑虑)。如果您在日期字段上没有索引,那么您将面临顺序表扫描(读取整个表),这非常糟糕。还要检查那些左连接,因为其中一个可能会弄乱查询计划。
根据经验,我会这样做:
等等......
即便如此,也许你的查询会花费大量时间,在这种情况下你可以做两件事