【发布时间】:2017-12-16 23:05:42
【问题描述】:
我正在从数据库中获取用户并将它们作为数组返回。查询返回 22000 个用户,这是正确的,现在我正在尝试保存这些用户信息 CSV 文件,但在此之前我必须检查每个用户的额外功能,例如 Applied Opportunities,所以检查每个用户,从数组中获取每个 ID 并将其传递给另一个函数需要很多时间,而且我还有 9 个其他函数需要检查。什么是最好的和优化的方法来做到这一点。请看下面的代码
$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 次,请帮我优化一下。
【问题讨论】:
-
foreach 中的函数是否包含查询?
-
最好的方法 - 使用一个 sql 查询获取所有附加数据。例如,代替为每个用户调用 vt_applied_opps((object)$q),进行单个 sql 查询,为所有用户返回数据。
-
这些函数可以移到数据库吗?也许是一个存储过程。
-
这些其他函数的信息是否存储在数据库中?如果是这样,那么为什么不使用子查询一次性收集所有信息呢? dev.mysql.com/doc/refman/5.7/en/subqueries.html
标签: php optimization foreach query-optimization