2012-03-30 72 views
0

我们有一个内部PHP Web应用程序,它是我们用户的财务分析工具。我们处理客户的财务信息以分析他们偿还贷款的能力。在类中处理多个查询的最佳方法?

我们已经构建了一个具有生成大量数字和比率的函数的类。我们使用这些来显示应用程序中不同页面的总计,比率等。我们有很多函数可以生成总计和大量函数,这些函数使用函数的总和来生成新的总计和比率。下面是一个例子:

//Coverage Ratio 
public function CoverageRatio($hma) { 
    return div_check(($this->NetFarmIncome($hma) + $this->NetNonFarmIncome($hma) - $this->FamilyLivingExpenses() - $this->IncomeTaxes()), ($this->InterestPortionTermDebt($hma) + $this->PrincipalPortionTermDebt($hma))); 
} 

//Operating Expense Ratio 
public function OperatingExpenseRatio($hma) { 
    return div_check($this->FarmOperatingExpenses($hma), $this->GrossFarmIncome($hma)); 
} 

//Net Nonfarm Income 
public function NetNonfarmIncome($hma = null) { 
    $result = $this->db->query("SELECT ah.id, COALESCE(v1.h1, 0) - COALESCE(v2.h2, 0) AS h, COALESCE(v1.p1, 0) - COALESCE(v2.p2, 0) AS p, COALESCE(v1.a1, 0) - COALESCE(v2.a2, 0) AS a FROM analysis_history ah LEFT JOIN (SELECT analysis_id, ... GROUP BY analysis_id) AS v2 ON v2.analysis_id = ah.id WHERE ah.id = $this->analysisid"); 
    $row = $result->fetch_assoc(); 
    return $row['a']; 
} 

//Net Business Income 
public function NetBusinessIncome($hma = null) { 
    $result = $this->db->query("SELECT ah.id, COALESCE(v1.h1, 0) - COALESCE(v2.h2, 0) AS h, COALESCE(v1.p1, 0) - COALESCE(v2.p2, 0) AS p, COALESCE(v1.a1, 0) - COALESCE(v2.a2, 0) AS a FROM analysis_history ah LEFT JOIN (SELECT analysis_id, ... GROUP BY analysis_id) AS v2 ON v2.analysis_id = ah.id WHERE ah.id = $this->analysisid"); 
    $row = $result->fetch_assoc(); 
    return $row['a']; 
} 

在过去的一年中,很多变化已经发生,我们不得不增加大量新的总计和比率。修改我们的应用程序以生成页面加载时间并计算执行的查询数量后,我们感到震惊。我们最大的页面需要0.8秒来生成并且有122个查询。

我们已经做了一些调整以减少查询次数,但我们只能削减大约10个查询总数。我们的平均页面有大约35个查询,我们觉得它太多了。

在我们的包含分析逻辑的类中,是否应该更改从多个函数中提取数据(并对数据库进行多次调用)的函数,并让它们执行单个查询?在我的CoverageRatio示例中,其中的每个函数都实际查询数据库 - 6个单独的查询。

哪个是更好地优化我们的代码的最佳方式?它的方式是否正确 - 我们喜欢这种方式以防万一需要改变 - 我们只改变产生该特定总数的函数。如果我们必须修改净收入计算方式,我们必须改变每个依赖该值的函数中的每个查询,这将成为一个噩梦。谢谢你的帮助!

+2

你看过优化数据库吗?确保你有良好的缓存和索引(在良好的表结构之上)可以使整个世界有所不同。 – BenOfTheNorth 2012-03-30 01:24:45

回答

3

如果要从同一组表中进行多项计算,则使用单个SELECT语句执行此操作会更有效,该SELECT语句可在单独的列中执行所有计算,而不是每个计算的单独SELECT语句。

您可能还可以通过使用临时表来保存多个其他查询所需的中间结果来提高性能,以避免在使用它们的每个查询中重新计算这些值。

如果您的查询涉及大量连接,请使用EXPLAIN研究数据库如何执行这些连接,并查看是否有可添加的索引以使连接更有效。一些精心挑选的指标可能会产生很大的差异。

+0

嗯 - 我曾考虑过这样做。有几个总计算(如资产总额,负债等)在几个功能中使用 - 我曾考虑过在每个页面负载上计算这些值,以便其他功能可以使用它们。这会更有效率吗? 是的,多个计算来自同一组大约10个表。我们广泛使用查询分析器来确保我们的查询得到优化 - 也许我们可以再次访问一些较大的查询。 – Jeff 2012-03-30 01:34:48

+0

任何你可以做一次而不是几次的事情总是会更有效率,即使它只是从流程中保存的一些查询的一部分。 – BenOfTheNorth 2012-03-30 01:36:36

相关问题