这更像是一个问题,而不是我需要解决的问题。我的后端速度很快,而且我的查询运行得很好,所以这不是重要的。好的,让我们开始吧。
我的仪表板上有 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 列:(timestamp
,month
,day
,week
) 或类似的东西。 - 您在 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';
您使用
一个 cron 作业来连接 mysql 并以第 1 点中定义的周期运行此过程。通常你可以像这样从命令行运行脚本:DBMS_JOB
mysql --user='cron_mysql_user'@'localhost' -pstrongpassword --execute="call proc_name()" db_name
您根据您的定期快照创建不错的报告:-)
这样做的好处是您每天只集中 I/O 几次,这是一种受控的方式,所以当您需要了解统计信息时,您只需执行非常简单的 SELECT 语句。
关于php - MySQL:如何在单个查询中查询多个 'statistics'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31597008/