Php 查询/调用函数的优化
我从数据库中获取用户并将其作为数组返回。查询返回22000个用户,这是正确的,现在我正在尝试保存这些用户信息CSV文件,但在此之前,我必须检查每个用户的额外功能,例如应用机会,因此检查每个用户,从数组中获取每个ID,并将其传递给其他函数需要很多时间,我还有9个其他功能需要检查。实现这一点的最佳优化方法是什么。请参阅下面的代码Php 查询/调用函数的优化,php,optimization,foreach,query-optimization,Php,Optimization,Foreach,Query Optimization,我从数据库中获取用户并将其作为数组返回。查询返回22000个用户,这是正确的,现在我正在尝试保存这些用户信息CSV文件,但在此之前,我必须检查每个用户的额外功能,例如应用机会,因此检查每个用户,从数组中获取每个ID,并将其传递给其他函数需要很多时间,我还有9个其他功能需要检查。实现这一点的最佳优化方法是什么。请参阅下面的代码 $sql = "SELECT id, first_name,last_name,position_id,user_company,role,last_login_date,
$sql = "SELECT id, first_name,last_name,position_id,user_company,role,last_login_date,
sf_id,user_email,login_count,user_registered FROM er_users";
$query = $this->db->query($sql);
$query = $query->result_array();
foreach ($query as $key => $q) {
$a_opps = vt_applied_opps((object)$q);
$s_opps = vt_suggested_opps((object)$q);
$i_requests_e = vt_interview_request((object)$q);
$i_requests_c = vt_company_interview_request((object)$q);
$i_to_apply = get_invitations_count($q["id"]);
$councils = vt_ac_count((object)$q);
$cbe = vt_cbe_credits((object)$q);
$forum = vt_forums((object)$q);
$bio = vt_is_bio((object)$q);
$resume = vt_is_resume((object)$q);
$q["a_opps"] = $a_opps;
$q["s_opps"] = $s_opps;
$q["i_requests_e"] = $i_requests_e;
$q["i_requests_c"] = $i_requests_c;
$q["i_to_apply"] = $i_to_apply;
$q["councils"] = $councils;
$q["cbe"] = $cbe;
$q["forum"] = $forum;
$q["bio"] = $bio;
$q["resume"] = $resume;
$query[$key] = $q;
}
这些是函数,它们的结果存储在变量中,然后这些变量被用于数组中。请帮我优化这个方法。因为有22K条记录,所以foreach循环运行了22K次,内部函数也运行了22K次,请帮助我优化这种方式
$sql=“选择id,
姓名、姓氏、职位id、用户公司、角色、上次登录日期、,
sf_id、用户_电子邮件、登录计数、从er_用户注册的用户”;
若您只需要id,那个么从SELECT子句中删除剩余的表字段
第二,
$a_opps=vt_applicated_opps((对象)$q)$s_opps=
vt_建议的opps((对象)$q)$我请求=
vt_面试请求((对象)$q)$我请求=
vt公司面试申请((对象)$q)
$i_to_apply=获取邀请数量($q[“id”])$理事会=
vt_ac_计数((对象)$q)$cbe=vt_cbe_学分((对象)$q)$forum=vt_论坛((对象)$q)$bio=vt_is_bio((对象)$q)
$resume=vt_是_resume((对象)$q) 如果这些函数都只从数据库中获取适当的结果,那么您可以使用上述SQL连接这些表,并忽略函数调用 这些可能真的有帮助 还要检查Table.field索引,如果您使用的是WHERE子句中的字段,而这些字段没有索引,那么请为这些字段添加索引并生成fast SELECT SQL $sql=“选择id, 姓名、姓氏、职位id、用户公司、角色、上次登录日期、, sf_id、用户_电子邮件、登录计数、从er_用户注册的用户”; 若您只需要id,那个么从SELECT子句中删除剩余的表字段 第二, $a_opps=vt_applicated_opps((对象)$q)$s_opps= vt_建议的opps((对象)$q)$我请求= vt_面试请求((对象)$q)$我请求= vt公司面试申请((对象)$q) $i_to_apply=获取邀请数量($q[“id”])$理事会= vt_ac_计数((对象)$q)$cbe=vt_cbe_学分((对象)$q)
$forum=vt_论坛((对象)$q)$bio=vt_is_bio((对象)$q)
$resume=vt_是_resume((对象)$q) 如果这些函数都只从数据库中获取适当的结果,那么您可以使用上述SQL连接这些表,并忽略函数调用 这些可能真的有帮助
还要检查Table.field indexing,如果您使用的是WHERE子句中的字段,而这些字段没有索引,请为这些字段添加索引,使之成为fast SELECT SQL。foreach中的函数是否包含查询?最好的方法是通过一个SQL查询获取所有其他数据。例如,为每个用户调用vt_applicated_opps((object)$q),进行单个sql查询,返回所有用户的数据。这些函数可以移动到数据库中吗?可能是一个存储过程。来自这些其他函数的信息是否存储在数据库中?如果是这样,为什么不使用子查询在一次传递中收集所有信息呢?foreach中的函数是否包含查询?最好的方法是通过一个sql查询获取所有附加数据。例如,为每个用户调用vt_applicated_opps((object)$q),进行单个sql查询,返回所有用户的数据。这些函数可以移动到数据库中吗?可能是一个存储过程。来自这些其他函数的信息是否存储在数据库中?如果是这样,为什么不使用子查询在一次传递中收集所有信息呢?我不能使用联接,因为数据库中的记录超过100K,所以它们将变得更慢…联接将变得慢,但如果使用索引,它将变得快。我不能使用联接,因为数据库中的记录超过100K,所以它们将变得更慢…联接将变得慢,但如果使用索引,它会变得很快。