如何缓存不经常更改的mysql查询?

时间:2013-07-09 13:11:14

标签: mysql sql database

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

我不会详细说明为什么它可能会很慢(我认为GROUPBY虽然没有帮助。)

我真正想知道的是,我如何基本上可以将其缓存以更快地工作,因为表格只会改变5-10次/小时,而用户每小时访问1000次时间。

有没有办法在db更改时重新生成/缓存结果,以便不再重新生成结果?

我对sql很陌生,所以任何基本的想法都可能有很长的路要走。

2 个答案:

答案 0 :(得分:0)

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

一种机制是使用应用程序级缓存。应用程序将存储先前的结果并在可能的情况下使用该结果。请注意,这对多个用户来说效果不佳。

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

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

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

所有这些都需要对应用程序进行一些更改。如果您的应用程序查询存储在视图中(类似于vw_FetchReport1),则更改很简单,并且都在服务器端。如果查询嵌入在应用程序中,则需要将其替换为其他内容。我强烈建议使用视图(或在其他数据库中用户定义的函数或存储过程)进行数据库访问。这为数据库应用程序定义了API,并极大地促进了此处所述的更改。

编辑:(回应评论)

有关在MySQL中安排作业的更多信息是here。我希望SQL代码类似于:

truncate table ReportTable;

insert into ReportTable
    select * from <ReportQuery>;

(实际上,您应在selectinsert语句中添加列表。)

答案 1 :(得分:0)

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

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