【问题标题】:PHP - Query on page with many requestsPHP - 在页面上查询许多请求
【发布时间】:2016-01-28 17:50:03
【问题描述】:

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

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

这还能怎么做?

【问题讨论】:

  • 你有两个表的主键吗?
  • 是的,在两个表的“Id”上。
  • 您是否查看过查询的EXPLAIN 以了解阻塞点可能在哪里。
  • 您是否需要实时信息.. 使用缓存(一段时间)就可以了。来自内部选择的字段类型索引也很有帮助
  • totalusers 已注册人数或访问人数。

标签: php sql join pdo


【解决方案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;

【讨论】:

  • 那是……如此简单。如此明显。谢谢你踢我的常识!
  • 只是一个小问题:我可以将“totalcashedout”和“totalclicks”写入同一个文件并仍然回显它吗?还是应该是 3 个单独的文件?
  • @oliverbj,您可以使用json_encode($stats) 将其保存为JSON,然后在加载文件后解析内容,例如echo json_decode(file_get_contents('stats.txt'))-&gt;totalclicks;
  • 作为 JSON?这对我来说还是很新的。我可以让你发布一个简单的例子吗?
  • @oliverbj,不客气!感谢您接受答案。
【解决方案2】:

据我所知,此查询没有任何特定于网站上任何用户的内容。因此,如果您为每个发出请求的用户执行此查询,那么您将进行数千个相同的查询。

你可以像这样做一种缓存:

创建一个与此查询的输出基本相似的表。

制作一个只执行此查询并使用最新结果更新上述表的 PHP 脚本。

将此 PHP 脚本作为 cron 作业每分钟执行一次以更新统计信息。

然后为每个请求运行的查询可以非常简单,例如:

SELECT totalusers cashedout, totalclicks FROM stats_table

【讨论】:

    【解决方案3】:

    从查询中,我看不出在其中使用子查询的任何真正理由,因为它不使用用户表中的任何数据,并且很可能会减慢它的速度 - 如果内存正确地为我服务,它将为您的用户表中的每一行查询 xeon_clicks 表一次(从事物的外观来看,这是很多行)。

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

    【讨论】:

      猜你喜欢
      • 2016-11-29
      • 1970-01-01
      • 2014-05-31
      • 2018-06-20
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-25
      相关资源
      最近更新 更多