php - MySQL:如何在单个查询中查询多个 'statistics'?

标签 php mysql

这更像是一个问题,而不是我需要解决的问题。我的后端速度很快,而且我的查询运行得很好,所以这不是重要的。好的,让我们开始吧。

我的仪表板上有 4 个统计面板,分别是今天、昨天、本周和本月的观看次数;每个在我的数据库中占用一个查询。我想知道的是,如何将所有这些查询放在一起以减轻数据库/服务器上的负载?

在提问之前,我正在浏览 Stackoverflow,看到有人说这样的话:

SUM(case when status = 'open' then 1 else 0 end) as [Open],
SUM(case when status = 'closed' then 1 else 0 end) as [Closed]

来源:Gathering multiple statistics about a table in a single query

这可能是我需要的,可能是这样的:

SUM(case when DATE(created_at) = '2015-07-23' then 1 else 0 end) as today,
SUM(case when DATE(created_at) = '2015-07-22' then 1 else 0 end) as yesterday,
SUM(case when WEEK(created_at) = '29' then 1 else 0 end) as week,
SUM(case when MONTH(created_at) = '7' then 1 else 0 end) as month

我只是想知道是否有人有一些更好的建议,因为我已经将其应用到我的函数中并且效果很好。

最佳答案

评论给出了很好的提示。我将在这里提供另一个想法,从概念上讲,我曾与之合作过的大多数银行都在使用这个想法。

当有数十亿行,并且您不需要为每个请求都提供精确的即时快照(意思是:您可以容忍稍微过时的数据)时,值得探索批处理。

它是这样工作的:

  1. 您定义您的滞后容忍度:例如:“我可以接受过时 8 小时的数据”。这是您的批处理的周期。
  2. 您对数据库进行非规范化以添加“冗余”列/表来存储您选择的运行总计。例如,您可以添加一个名为 statistics_snapshot 的表,其中包含 4 列:(timestamp, month, day, week) 或类似的东西。
  3. 您在 mysql 中创建了一个存储过程,用您的 4 个查询或您建议的一个全局查询填充此表。还会记录一个时间戳,以便您知道拍摄时间。
  4. 您为该过程创建一个具有 EXECUTE 授权的用户,

    CREATE USER 'cron_mysql_user'@'localhost' IDENTIFIED BY 'strongpassword';
    GRANT EXECUTE ON PROCEDURE db_name.proc_name TO 'cron_mysql_user'@'localhost';
    
  5. 您使用 DBMS_JOB 一个 cron 作业来连接 mysql 并以第 1 点中定义的周期运行此过程。通常你可以像这样从命令行运行脚本:

    mysql --user='cron_mysql_user'@'localhost' -pstrongpassword --execute="call proc_name()" db_name
    
  6. 您根据您的定期快照创建不错的报告:-)

这样做的好处是您每天只集中 I/O 几次,这是一种受控的方式,所以当您需要了解统计信息时,您只需执行非常简单的 SELECT 语句。

关于php - MySQL:如何在单个查询中查询多个 'statistics'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31597008/

相关文章:

MySql和subselect,为什么这么慢?

php - 日期和时间错误 12-31-1969, 7 :00 PM

php - 如何在 PHP 上使用 substr_count 计算阿拉伯语子字符串

php - 我需要清理数据库中的数据吗?

php - Curl 失败并出现 HTTP 错误 500

php - 防止站点导航重叠标题

php - 如何编写 php MySql 查询

mysql - 如何将 MySQL 中不明确的别名解析为当前表的定义

php - Woocommerce:以编程方式更新购物车中的项目

php - 通过参数传递对象的键