我有一个执行/获取(在工作台中)需要8秒的mysql查询。
我不会深入讨论为什么它可能很慢的细节(我认为GROUPBY没有帮助)。
我真正想知道的是,我如何才能更快地缓存它,因为表只有5-10次/小时的变化,而用户访问网站的次数却高达1000次/小时。
有没有一种方法可以在数据库改变时只重新生成/缓存结果,这样结果就不会不断地重新生成?
我是sql的新手,所以任何基本的想法都可能会有很大的帮助。
发布于 2013-07-09 21:19:36
我不熟悉MySQL中的这种缓存功能。还有其他选择。
一种机制是使用应用程序级缓存。应用程序将存储先前的结果,并在可能的情况下使用该结果。注意,对于多个用户,这并不能很好地工作。
您可能希望将报告存储在单独的表中。然后你可以每五分钟左右运行一次。这将是一种使用作业调度程序来运行作业的简单机制。
它的一个变种是使用一个存储过程,它首先检查数据是否已更改。如果底层数据已更改,则存储过程将重新生成报告表。存储过程完成后,报告表将是最新的。
另一种方法是在底层数据发生变化时使用触发器。触发器可以运行查询,将结果存储在表中(如上所述)。或者,触发器可以只更新报告中可能已更改的行(更难,因为它涉及到理解报告背后的业务逻辑)。
所有这些都需要对应用程序进行一些更改。如果您的应用程序查询存储在视图(类似于vw_FetchReport1)中,那么更改很小,而且全部在服务器端。如果查询被嵌入到应用程序中,那么您需要用其他东西替换它。我极力主张使用视图(或者在其他数据库中,用户定义的函数或存储过程)进行数据库访问。这定义了数据库应用程序的API,并极大地促进了诸如此处所述的更改。
编辑:(回复评论)
有关在MySQL中调度作业的更多信息,请访问here。我希望SQL代码是这样的:
truncate table ReportTable;
insert into ReportTable
select * from <ReportQuery>;(实际上,您应该在select和insert语句中包含列列表。)
发布于 2013-07-09 21:39:24
一种可用于加快长时间运行查询的响应时间的简单解决方案是,根据底层数据刷新或业务需求定期生成汇总表。
例如,如果您的业务不关心分分钟的“准确性”,您可以每分钟运行一次流程,并使您的用户界面查询此计算表,而不是在线汇总原始数据。
https://stackoverflow.com/questions/17549043
复制相似问题