我的主页上有大约700到800名访问者(根据分析)和一般的大量点击。但是,我希望在我的主页上显示我的用户和其他内容的实时统计信息。因此我有这个:
$stmt = $dbh->prepare("
SELECT
count(*) as totalusers,
sum(cashedout) cashedout,
(SELECT sum(value) FROM xeon_stats_clicks
WHERE typ='1') AS totalclicks
FROM users
");
$stmt->execute();
$stats=$stmt->fetch();
然后我将其用作$stats["totalusers"]
等。
table.users have `22210` rows, with index on `id, username, cashedout`, `table.xeon_stats_clicks` have index on `value` and `typ`
但是,每当我启用上述查询时,我的网站会立即变得非常慢。一旦我禁用它,加载时间就会大幅下降。
怎么办呢?
答案 0 :(得分:1)
据我所知,此查询没有任何特定于网站上任何用户的信息。因此,如果您为发出请求的每个用户执行此查询,则会生成数千个相同的查询。
你可以像这样进行一种缓存:
创建一个基本上类似于此查询输出的表。
创建一个只执行此查询的PHP脚本,并使用最新结果更新上述表。
每分钟执行一次PHP脚本作为cron作业来更新统计数据。
然后,为每个请求运行的查询可以非常简单,例如:
SELECT totalusers cashedout, totalclicks FROM stats_table
答案 1 :(得分:1)
你应该不这样做。正如您现在所经历的那样,您最终会挖掘您宝贵的数据库资源。好方法是在30秒或1分钟间隔内运行单独的cronjob,然后将结果写入文件:
file_put_contents('stats.txt', $stats["totalusers"]);
然后在您的主页上
<span>current users :
<b><? echo file_get_contents('stats.txt');?></b>
</span>
美妙的是,HTTP服务器将缓存此文件,因此在更改stats.txt
之前,副本也将在缓存中提前。
示例,按文件保存/加载JSON:
$test = array('test' => 'qwerty');
file_put_contents('test.txt', json_encode($test));
echo json_decode(file_get_contents('test.txt'))->test;
将输出qwerty
。将$test
替换为$stats
,如评论
echo json_decode(file_get_contents('stats.txt'))->totalclicks;
答案 2 :(得分:0)
从查询中,我看不到任何真正的理由在那里使用子查询,因为它不使用users表中的任何数据,并且可能会减慢它的速度 - 如果内存我是正确的,它将为你的用户表中的每一行查询xeon_clicks表一次(根据事物的外观,这是很多行)。
尝试将其作为两个单独的查询而不是一个查询。