1

我有一个进程需要每 X 分钟运行一次以更新某些信息。查询需要 10 秒、20 秒甚至一分钟都没有关系。重要的是,例如,信息至少每 10 分钟更新一次。

因为查询速度很慢,并且服务器正用于其他查询,所以会影响其他用户。这是我试图解决的情况。

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

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

4

1 回答 1

0

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

  1. 使有问题的查询花费更少的时间。这可以通过其中一种或两种方式来完成。

    一个。将其分解为较小的查询

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

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

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

1a:以几百或几千条记录为单位进行更新。重复这些(较短的)更新,直到您的任务完成。一旦每个段运行,它就会离开并让其他查询完成。

1b:阅读有关使用EXPLAIN和使用索引以加快查询速度的信息。让您的大查询更快。索引可以大大加快您的WHERE条款。

2:您可以为系统上的查询设置隔离级别,这样它们就不会相互依赖。这可能让他们更优雅地共享服务器。在发出更新作业阻止的查询之前发出查询以将隔离级别设置为正确。READ UNCOMMITTED这将使他们完成,并使用更新作业完成之前存在的数据,而不是等待作业。

 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

在您发出其他查询之前。

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

于 2017-10-14T15:02:06.763 回答