MySQL:如何在单个查询中查询多个“统计信息”?

时间:2015-07-23 20:02:51

标签: 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 个答案:

答案 0 :(得分:3)

评论提供了很好的提示。我将在这里提供另一个想法,概念上用于我一直在使用的大多数银行。

如果有数十亿行,并且您不需要为每个请求提供准确的即时快照(意味着:您对稍微过时的数据有容忍度),则值得探索批处理过程。

这是它的工作原理:

  1. 您可以定义滞后容差:例如:“我对数据过时8小时没问题”。这是批处理的周期性。
  2. 您对数据库进行非规范化,以添加存储您选择的运行总计的“冗余”列/表。例如,您要添加一个名为statistics_snapshot的表格,其中包含4列:( timestampmonthdayweek)或类似内容。< / LI>
  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. 您可以根据定期快照创建漂亮的报告: - )

  7. 这样做的好处在于,您每天只能以受控方式集中I / O几次,因此当您需要了解统计信息时,您只需要执行非常轻松的SELECT语句。