我有一个脚本,它查询一个包含 50,000 条记录的数据库,并尝试创建一个表格,概述每周数据库中新条目总数的每周报告。
我有一个限制:报告必须从 开始$START_DATE
,这是网站每个部分下的数据库中任何用户都存在记录的第一天。这意味着我不能使用查找预定义日期的函数,我必须在第一个用户进入数据库的第一秒为界的部分中计算用户,直到恰好一周后,直到$END_DATE
通常是简单的time()
.
count(*)
在数据库中查询 a或大约需要 5 秒select *
:
mysql> select count(*), user_type from users_table where user_permissions = "normal" group by user_type;
+----------+-----------------+
| count(*) | user_type |
+----------+-----------------+
| 2210 | myspace_user |
| 48659 | facebook_user |
+----------+-----------------+
2 rows in set (4.73 sec)
我有一些 PHP 代码遍历并查询数据库多次,user_type
以获得每周的详细报告表。问题是,有 12 周和两种用户类型,因此整个过程最多需要两分钟。网站的某些部分有两种以上的用户类型,这些查询需要更长的时间。这是代码:
$start = strtotime($START_DATE);
$end = strtotime($END_DATE);
for ($i = 0; $start+$i < time() && $start+$i < $end; $i+= (7*24*60*60)) {
$weekly_total = 0;
foreach($USERTYPES as $usertype) {
$q = "select count(*) from users_table where user_type = '" . $usertype . "' and user_permissions = 'normal'";
$q .= " and UNIX_TIMESTAMP(timestmp) >= " . strval($start+$i) . " and UNIX_TIMESTAMP(timestmp) <= " . strval($start+$i+(7*24*60*60));
$r = mysql_query($q);
$v = mysql_fetch_array($r);
$table['weekly'][gmdate("Y-m-d", $start+$i)][$usertype] += $v[0];
$weekly_total += $v[0];
}
$table['weekly'][gmdate("Y-m-d", $start+$i)]['weekly_total'] = $weekly_total;
}
最后,我有一个包含 12 个条目的数组,其基本结构最终类似于以下伪代码:
// ...previous entries
$table['weekly']['2013-07-01'] = array(
'myspace_user' => 123,
'facebook_user' => 1234,
'weekly_total' => 1357
);
$table['weekly']['2013-07-08'] = array(
// ...and so on
生成这些查询并将它们保存到表中的过程需要很长时间。有什么方法可以让 MySQL 或 PHP 函数更高效,这样我就不必每周生成单独的查询?