每次访问我的网站都会更新用户的个人点击计数器,并根据存储在cookie中的ip地址和id更新time()的一列。因此,在输出数据时,下面的代码有什么更有效的方式来减少数据库调用,因为它本质上是自身的副本:
<?
$last1Min = time()-60;
$last5Mins = time()-300;
$last1Hr = time()-6000;
$last1Dy = time()-144000;
$last1Wk = time()-1008000;
$last1Mnth = time()-30240000;
//last1Min
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Min";
while($rows = mysql_fetch_array(mysql_query($sql))) {
echo "Users online in the last minute: " . $rows['COUNT(*)'] . "<br />\n";
}
//last5Mins
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last5Mins";
while($rows = mysql_fetch_array(mysql_query($sql))) {
echo "Users online in the last 5 minutes: " . $rows['COUNT(*)'] . "<br />\n";
}
//last1Hr
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Hr";
while($rows = mysql_fetch_array(mysql_query($sql))) {
echo "Users online in the last hour: " . $rows['COUNT(*)'] . "<br />\n";
}
//last1Dy
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Dy";
while($rows = mysql_fetch_array(mysql_query($sql))) {
echo "Users online in the last day: " . $rows['COUNT(*)'] . "<br />\n";
}
//last1Wk
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Wk";
while($rows = mysql_fetch_array(mysql_query($sql))) {
echo "Users online in the last week: " . $rows['COUNT(*)'] . "<br />\n";
}
//last1Mnth
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Mnth";
while($rows = mysql_fetch_array(mysql_query($sql))) {
echo "Users online in the last month: " . $rows['COUNT(*)'] . "<br /><br />\n";
}如果有一种更有效的方式来呈现这些数据,我想扩展它,不仅显示每个指标的用户在我的整个网站上有多少人在线,而且记录和输出我网站上每个页面的数据。
发布于 2009-05-21 00:22:56
SELECT
SUM(lastOnline <= 60) AS one_minute,
SUM(lastOnline <= 300) AS five_minutes,
...
SUM(lastOnline <= 30240000) AS one_month
FROM usersonline使用这种方法,您可以通过单次表扫描在单个查询中获得所需的所有内容;它的效率不会比这个更高。正如其他人提到的,您应该缓存结果,因为它相对昂贵(即使是在这种优化的形式下)。计算每个页面的负载是没有意义的,特别是如果你每秒看到多个点击(如果你点击digg的首页,这是极有可能的)
对于条件为真的行,lastOnline <= 60的计算结果为1;对于条件为假的行,计算结果为0;SUM()对这两个1和0求和,得到条件为真的行数的计数。
几年前从mysql文档中的用户评论中学到了这项技术;有similar examples elsewhere
发布于 2009-05-21 00:04:42
设置一个cron作业,每分钟/5分钟/其他时间只计算一次正确值。缓存结果并显示结果。当这些统计数据每分钟或每半小时只改变一次时,真的没有必要每秒计算X次。
发布于 2009-05-21 00:01:37
您可以只调用上个月内的所有时间,并按日期排序,而不是为每个时间调用数据库。然后,在php中,您可以比较日期和时间,以查看用户上次登录有多长时间。
https://stackoverflow.com/questions/890820
复制相似问题