我正在修改一个PHP页面,该页面显示我们所有的项目,每个项目都包含有关每个项目的各种统计信息。我们正在考虑从一年前的第一个月到昨天的一段时间。我设法让脚本的基本版本正常工作,但效果不佳。此脚本的初始实现(不是我的修订版)一次检索所有销售记录和项目信息,然后使用生成的记录创建对象(而不是mysql_fetch_objects)。然后将它们存储在一个数组中,该数组使用硬编码值来访问对象的属性。这一切的设置方式相当混乱,并且不易于重复使用。但是,它比我的实现快得多,因为它只调用一次或两次数据库。
我的实施使用了三个电话。第一个获取为报告范围创建DateTime
个对象所需的基本报告信息(跨越12个月前的第一个月到昨天的日期)。然而,这是它的全部用途,我真的不认为我甚至需要拨打这个电话。第二个检索报告中包含的项目的所有基本信息。这出现在854条记录中。最后一个select
语句检索这些项目的所有销售信息,最后一次检查,这返回了超过6000条记录。
我尝试做的只是选择与循环中当前项目相关的记录,由以下表示。
foreach($allItems as $item){
//Display properties of item here
//db_controller is a special class used to handle DB manipulation
$query = "SELECT * FROM sales_records WHERE ...";
$result = $db_controller->select($query);
//Use sales records to calculate report values
}
这就是问题所在。为每个项目调用数据库非常耗时,并且会极大地影响性能。返回的内容只是在脚本中先前指定的时间范围内每月销售的数量总和,以及产生的销售额。每个项目最多只有13条销售记录,例如2015/1至2016/1。但是,我不确定在循环之前对所有这些销售记录执行单次提取是否有助于提高性能,原因是我必须在结果数组中搜索与销售记录相关的第一个实例。当前项目。我该怎么做才能缓解这个问题?由于这是一个对公司运营很重要的脚本,我想确保我的脚本上的性能与旧脚本一样快,或者至少只比旧脚本稍慢。我的结果很准确,但速度很慢。