首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何缓存不经常变化的mysql查询?

如何缓存不经常变化的mysql查询?
EN

Stack Overflow用户
提问于 2013-07-09 21:11:14
回答 2查看 108关注 0票数 1

我有一个执行/获取(在工作台中)需要8秒的mysql查询。

我不会深入讨论为什么它可能很慢的细节(我认为GROUPBY没有帮助)。

我真正想知道的是,我如何才能更快地缓存它,因为表只有5-10次/小时的变化,而用户访问网站的次数却高达1000次/小时。

有没有一种方法可以在数据库改变时只重新生成/缓存结果,这样结果就不会不断地重新生成?

我是sql的新手,所以任何基本的想法都可能会有很大的帮助。

EN

回答 2

Stack Overflow用户

发布于 2013-07-09 21:19:36

我不熟悉MySQL中的这种缓存功能。还有其他选择。

一种机制是使用应用程序级缓存。应用程序将存储先前的结果,并在可能的情况下使用该结果。注意,对于多个用户,这并不能很好地工作。

您可能希望将报告存储在单独的表中。然后你可以每五分钟左右运行一次。这将是一种使用作业调度程序来运行作业的简单机制。

它的一个变种是使用一个存储过程,它首先检查数据是否已更改。如果底层数据已更改,则存储过程将重新生成报告表。存储过程完成后,报告表将是最新的。

另一种方法是在底层数据发生变化时使用触发器。触发器可以运行查询,将结果存储在表中(如上所述)。或者,触发器可以只更新报告中可能已更改的行(更难,因为它涉及到理解报告背后的业务逻辑)。

所有这些都需要对应用程序进行一些更改。如果您的应用程序查询存储在视图(类似于vw_FetchReport1)中,那么更改很小,而且全部在服务器端。如果查询被嵌入到应用程序中,那么您需要用其他东西替换它。我极力主张使用视图(或者在其他数据库中,用户定义的函数或存储过程)进行数据库访问。这定义了数据库应用程序的API,并极大地促进了诸如此处所述的更改。

编辑:(回复评论)

有关在MySQL中调度作业的更多信息,请访问here。我希望SQL代码是这样的:

代码语言:javascript
复制
truncate table ReportTable;

insert into ReportTable
    select * from <ReportQuery>;

(实际上,您应该在selectinsert语句中包含列列表。)

票数 0
EN

Stack Overflow用户

发布于 2013-07-09 21:39:24

一种可用于加快长时间运行查询的响应时间的简单解决方案是,根据底层数据刷新或业务需求定期生成汇总表。

例如,如果您的业务不关心分分钟的“准确性”,您可以每分钟运行一次流程,并使您的用户界面查询此计算表,而不是在线汇总原始数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17549043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档