这更像是一个问题,而不是我需要解决的问题。我的后端很快,我的查询运行得很好,所以 并不重要。好的,但是让我们来看看。
我的仪表板上有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
我只是想知道是否有人提出了一些更好的建议,因为我已将此功能应用于我的功能,并且工作正常。
答案 0 :(得分:3)
评论提供了很好的提示。我将在这里提供另一个想法,概念上用于我一直在使用的大多数银行。
如果有数十亿行,并且您不需要为每个请求提供准确的即时快照(意味着:您对稍微过时的数据有容忍度),则值得探索批处理过程。
这是它的工作原理:
statistics_snapshot
的表格,其中包含4列:( timestamp
,month
,day
,week
)或类似内容。< / LI>
您为该程序创建了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语句。