PHP - 在页面上查询有很多请求

时间:2015-10-28 19:22:09

标签: php sql join pdo

我的主页上有大约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`

但是,每当我启用上述查询时,我的网站会立即变得非常慢。一旦我禁用它,加载时间就会大幅下降。

怎么办呢?

3 个答案:

答案 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表一次(根据事物的外观,这是很多行)。

尝试将其作为两个单独的查询而不是一个查询。