我们有一个内部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个单独的查询。
哪个是更好地优化我们的代码的最佳方式?它的方式是否正确 - 我们喜欢这种方式以防万一需要改变 - 我们只改变产生该特定总数的函数。如果我们必须修改净收入计算方式,我们必须改变每个依赖该值的函数中的每个查询,这将成为一个噩梦。谢谢你的帮助!
你看过优化数据库吗?确保你有良好的缓存和索引(在良好的表结构之上)可以使整个世界有所不同。 – BenOfTheNorth 2012-03-30 01:24:45