【问题标题】:Optimization of query/calling function查询/调用功能优化
【发布时间】: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


【解决方案1】:

$sql = "选择 id, first_name,last_name,position_id,user_company,role,last_login_date, sf_id,user_email,login_count,user_registered FROM er_users"; 如果您只需要 id,则从 SELECT 子句中删除剩余的表字段。

第二,

$a_opps = vt_applied_opps((object)$q); $s_opps = vt_suggested_opps((对象)$q); $i_requests_e = vt_interview_request((对象)$q); $i_requests_c = vt_company_interview_request((object)$q);

$i_to_apply = get_invitations_count($q["id"]); $理事会= vt_ac_count((对象)$q); $cbe = vt_cbe_credits((对象)$q);
$forum = vt_forums((对象)$q); $bio = vt_is_bio((object)$q);
$resume = vt_is_resume((object)$q);

如果这些函数只从数据库中得到适当的结果,那么你可以用上面的 SQL 连接那些表,而忽略函数调用。

这些真的可能会有所帮助。

还要检查 Table.field 索引,如果你使用 WHERE 子句中的字段,而这些字段没有索引,那么请为这些字段添加索引,以便快速 SELECT SQL。

【讨论】:

  • 我不能使用连接,因为数据库中的记录超过 100K,所以它们会变得更慢......
  • JOIN 会变慢,但如果你使用索引,它会变快。
猜你喜欢
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 2016-12-01
  • 2020-07-05
  • 2013-07-02
相关资源
最近更新 更多