0

我有一个进程需要运行每X分钟来更新某些信息。查询需要10秒,20秒甚至一分钟无关紧要。但重要的是,信息至少每10分钟更新一次。限制分配给慢MySQL查询的资源

由于查询速度慢,而且服务器正在用于其他查询,因此会影响其他用户。这是我正在努力解决的情况。

我会cpulimit无论哪个进程运行查询,但占用所有资源的进程是MySQL服务器本身,所以看起来我需要一些MySQL特定的设置。

这是导致服​​务器冻结的单个MySQL查询。我想限制分配给该特定查询的资源。

+0

关于限制系统资源没有优化器提示。限制资源的唯一方法是使用索引优化查询。 –

+0

请阅读。 http://meta.stackoverflow.com/a/271056/要特别关注性能部分。请编辑您的问题以提供相关的详细信息。 –

+0

无法执行资源约束。相反,请向我们展示查询,它的'EXPLAIN ...'和'SHOW CREATE TABLE'用于它使用的任何表格。从那里,我们可以讨论更好的索引,分成大块等。 –

回答

0

MySQL无法告诉mysqld服务器对某些查询使用较低优先级或较少资源。您需要专注于这些事情:

  1. 使违规查询花费更少的时间。这可以通过一种或两种方式来完成。

    a。将其分解为更小的查询

    b。创建适当的索引以使其更快速

  2. 使其对其他查询的干扰减少。

您没有向我们展示查询,所以此答案的其余部分基于猜测。

1a:在几百或几千条记录的块中进行更新。重复这些(更短)的更新,直到您的任务完成。一旦每个细分受众群运行起来,它就会消失,让其他查询结束。

1b:阅读有关使用EXPLAIN并使用索引更快地查询。让你的大查询更快。索引可以加速你的WHERE子句。

2:您可以为您的系统设置isolation level查询,以便它们对彼此没有太多依赖性。这可以让他们更优雅地共享服务器。在发出被更新作业阻止的查询之前,发出query to set the isolation level to READ UNCOMMITTED。这将让他们完成,并使用更新作业完成前存在的数据,而不是等待作业。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 

在您发出其他查询之前。

如果您控制整个服务器,则可能更容易将READ UNCOMMITTED设置为默认隔离级别。

+0

基本上,该进程更新SPHINX搜索数据库,该数据库是从其他表的视图创建的。 –

+0

你的意思是推荐'READ COMMITTED'吗?我从来没有见过用'READ UNCOMMITTED'的好用例。该隔离级别破坏了原子性,因为它允许事务查看部分完成的事务。 –

+0

我的意思是'READ UNCOMMITTED'。提问者的应用程序很可能是这种隔离级别的有效用例。每X分钟一些新的数据到达搜索。长期运行的更新过程使其可供搜索引擎使用。如果通用查询流量可以成功读取旧数据而不是新数据,那么'UNCOMMITTED'应该可以很好地工作。尽管如此,如果更新是针对或多或少的独立数据项目,那才是真实的。 –