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

我只是想知道是否有人有更好的建议,因为我已将此应用于我的功能,它工作得很好.

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

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

这是它的工作原理:

>您定义了滞后容差:例如:“我对数据过时8小时没问题”.这是批处理的周期性.
>您对数据库进行非规范化,以添加存储您选择的运行总计的“冗余”列/表.例如,您将添加一个名为statistics_snapshot的表,其中包含4列:(时间戳,月,日,周)或类似的内容.
>您在mysql中创建一个存储过程,用您的4个查询填充此表,或者按照您的建议填充一个全局查询.时间戳也会被注册,因此您知道它何时被拍摄.
>仅为该过程创建具有EXECUTE授权的用户.

CREATE USER 'cron_mysql_user'@'localhost' IDENTIFIED BY 'strongpassword';
GRANT EXECUTE ON PROCEDURE db_name.proc_name TO 'cron_mysql_user'@'localhost';

>您使用DBMS_JOB cron作业连接mysql并使用第1点中定义的周期运行此过程.通常,您可以从命令行运行脚本,如下所示:

mysql --user='cron_mysql_user'@'localhost' -pstrongpassword --execute="call proc_name()" db_name

>您可以根据定期快照创建漂亮的报告:-)

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

转载注明原文:php – MySQL:如何在单个查询中查询多个“统计信息”? - 代码日志