1

I have a mysql query that is taking 8 seconds to execute/fetch (in workbench).

I won't go into the details of why it may be slow (I think GROUPBY isnt helping though).

What I really want to know is, how I can basically cache it to work more quickly because the tables only change like 5-10 times/hr, while users access the site 1000s times/hour.

Is there a way to just have the results regenerated/cached when the db changes so results are not constantly regenerated?

I'm quite new to sql so any basic thought may go a long way.

4

2 回答 2

0

我不熟悉 MySQL 中的这种缓存工具。有替代方案。

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

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

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

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

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

编辑:(回应评论)

有关在 MySQL 中调度作业的更多信息,请参见此处。我希望 SQL 代码类似于:

truncate table ReportTable;

insert into ReportTable
    select * from <ReportQuery>;

(实际上,您可以在selectandinsert语句中包含列列表。)

于 2013-07-09T13:19:35.577 回答
0

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

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

于 2013-07-09T13:39:23.837 回答