我们正在运行一个基于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秒,以便在实时系统上显示结果, 它会超时

您能否提出任何方法来提高速度以及如何实现它们。

仅供参考,每个表中的行如下:

  • patientappdetails - 195k
  • 患者 - 34k
  • 员工 - 200
  • departmentalservices - 700
  • insproviders - 2800

谢谢

#1楼 票数:1

通常在你有很多联接的情况下,特别是在加入大量记录时(每个患者对医生/工作人员的详细信息和类似情况的预约),分别获取这些记录并在SQL服务器之外加入它们是有意义的 - 在应用服务器上
我建议一次获取医生/员工/部门服务(可能是提供者)的详细信息,并将它们存储在应用程序服务器上的应用程序缓存中。 然后,您的SQL查询只需要获取患者和约会的详细信息,这将导致相当小(较短的记录)结果集。
考虑到您的选择大小(我假设它是某种报告功能),您应该考虑分页和/或批处理。

#2楼 票数:1 已采纳

好吧,让我们从索引开始吧。 我假设你已经为patienappointments.date创建了一个索引,这是一个集群类型的索引。 我还假设你有一个关于ds.departgroupid的索引。 你错过了几张桌子的大小,但我会猜测那些左边的连接是罪魁祸首。 查询执行计划应该产生一些有趣的结果(如果你可以在这里发布它可能有助于消除一些疑虑)。 如果您在日期字段上没有索引,那么您将面临顺序表扫描(读取整个表),这非常糟糕。 还检查那些左连接,因为其中一个可能搞乱了查询计划。

根据经验,我会这样做:

  1. 仅使用内部联接运行查询,并测试所需的时间
  2. 获取查询计划并查看是否可以优化(通过主要添加索引)
  3. 使用WHERE语句运行步骤1的查询
  4. 查询计划和优化
  5. 此时添加一个左连接
  6. 查询计划和优化

等等...

即便如此,也许你的查询会花费大量时间,在这种情况下你可以做两件事

  1. 添加更多硬件(拥有更多内存和更好的磁盘永远不会伤害)
  2. 基于优化的输入,使用时间表将查询拆分为更小的部分,优化器可以加速好的部分。

  ask by Shakir translate from so

未解决问题?本站智能推荐:

1回复

通过大数据类型搜索SQL时是否提高性能?

场景: 我在.Net上使用指纹识别系统。 每个指纹模板都被捕获为字节数组类型,长度为1632,但是大多数指纹模板并未使用所有长度。 我将它们作为VARBINARY数据类型“模板”列插入SQL数据库。 现在执行身份验证,我需要将输入的指纹样本与每个SQL记录中的“ Template
2回复

1.44亿行表查询SQL的性能帮助-非常慢

我的查询需要帮助。 该表有1.44亿行,这是一个阶段表(我们在其中插入另一个表的数据)。 我之前没有索引,并且该作业已经运行了9多个小时。 我将非聚集索引添加到具有多个列(AdvertiserName,MediaPlanName,MediaPlanNumber,CreativeDescri
1回复

在大型数据库MySQL中多次搜索的最有效方法是什么

我有GEO ip位置数据库,每个县都有与之关联的IP范围。 我有很多IP(100万),我需要通过在geo_database中查找将每个IP与正确的国家/地区关联。 我目前使用此效率低下的查询(Python btw): 如您所见,对列表中的每个IP执行此操作将花费大量时间,因
1回复

寻找使用 Laravel 处理大型 XML 文件以将部分导入 MySQL 数据库的更好方法

我有一个相当大(~65MB)的 XML 文件,有近 100 万行,我使用 Laravel 来解析和处理内容,然后将新数据插入 MySQL 数据库。 这是一个我定期更新的音乐库,我使用的软件会生成这个 XML 文件。 代码本身运行良好,但需要很长时间。 超过 30 分钟处理约 50,000 条记录!
1回复

Nodejs桌面应用程序与基于Web的应用程序性能

我的老板现在处在十字路口:我们有一个报价要为一家大型跨国公司创建应用程序,该公司希望在地图上同时监视大量的车辆。 我当时说的是5000。 尽管我们努力优化代码,但我们还是尝试在当前的基于Web的应用程序中做到这一点,但由于对象数量过多,它仍然会阻塞。 我的问题是:如果我们通过nodejs的
4回复

大型数据集的PROC SQL更新效率

我有一个具有1000万行和1800列的SAS主数据集。 我需要使用具有1500万条记录的交易数据集来更新10列,仅适用于具有匹配键的记录。 我尝试使用以下代码运行proc sql更新语句。 我只是为了进行测试而尝试了col1,它已经运行了4多个小时。 我可以想到数据合并,方法是
2回复

大型数据集中的oracle sql性能

我有这样的查询。 我使用Jpa并仅检索前50个结果,但是在拥有200万条记录的表上花费的时间太长。 如何提高性能?
1回复

几个大型对象的PHP对象序列化

我正在开发一个php应用程序,该应用程序在与用户交互的过程中会构建多个大型对象集合。 对象需要在用户的请求之间保持持久,并且我已经使用php会话成功实现了这一点。 这些对象将一直保留到用户对其所做的工作感到满意,并要求保存由这些对象表示的信息。 在对应用程序进行性能分析时,我发现会话开