Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL:如何在一个查询中查询多个“统计信息”?_Php_Mysql - Fatal编程技术网

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

Php MySQL:如何在一个查询中查询多个“统计信息”?,php,mysql,Php,Mysql,这更像是一个问题,而不是我需要解决的问题。我的后端速度很快,我的查询运行得很好,所以这并不重要。好吧,但让我们开始吧 我的仪表板上有4个统计面板,显示了今天、昨天、本周和本月的浏览量;每个都占用我数据库中的一个查询。我想知道的是,如何将所有这些查询放在一起以减轻数据库/服务器上的负载 在询问之前,我查看了Stackoverflow,看到其中一个说了这样的话: SUM(case when status = 'open' then 1 else 0 end) as [Open], SUM(case

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

我的仪表板上有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]
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
资料来源:

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

SUM(case when status = 'open' then 1 else 0 end) as [Open],
SUM(case when status = 'closed' then 1 else 0 end) as [Closed]
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列:timestamp、month、day、week或类似的内容。 您可以在mysql中创建一个存储过程,用4个查询或您建议的一个全局查询填充该表。时间戳也会被注册,这样你就可以知道它是什么时候被取的。 您只能为该过程创建一个具有执行授权的用户

使用DBMS_JOB和cron JOB连接mysql,并按照第1点中定义的周期运行此过程。通常可以从命令行运行脚本,如下所示:

mysql --user='cron_mysql_user'@'localhost' -pstrongpassword --execute="call proc_name()" db_name
您可以基于定期快照创建漂亮的报告:-


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

虽然这样做可能有助于减轻服务器上的负载,但如果查询变得过于复杂,它们也可能会阻碍它;这实际上取决于所需的数据以及服务器的功能。您可以缓存这些值,然后在需要时使缓存失效。另一种方法可能是使用触发器之类的东西并维护实际测量值,而不是计算它们。各有利弊。不管怎么说,缓慢变化的时间维度意味着在给定的时间间隔缓存这些维度。谢谢!这很有道理。我将尝试这两种方法,并在获得更多数据后,看看它们随着时间的推移表现如何。我会尝试缓存它们,反正我不需要实时更新,所以不妨尝试:-非常感谢:-我会尝试一下,特别是因为它是一个私人仪表盘,所以实时数据不会非常重要。如果有什么事,我会告诉你的。