我有一个进程需要每 X 分钟运行一次以更新某些信息。查询需要 10 秒、20 秒甚至一分钟都没有关系。重要的是,例如,信息至少每 10 分钟更新一次。
因为查询速度很慢,并且服务器正用于其他查询,所以会影响其他用户。这是我试图解决的情况。
我会cpulimit
运行查询的任何进程,但占用所有资源的进程是 MySQL 服务器本身,所以看起来我需要一些 MySQL 特定的设置。
这是导致服务器冻结的单个 MySQL 查询。我想限制分配给该特定查询的资源。
我有一个进程需要每 X 分钟运行一次以更新某些信息。查询需要 10 秒、20 秒甚至一分钟都没有关系。重要的是,例如,信息至少每 10 分钟更新一次。
因为查询速度很慢,并且服务器正用于其他查询,所以会影响其他用户。这是我试图解决的情况。
我会cpulimit
运行查询的任何进程,但占用所有资源的进程是 MySQL 服务器本身,所以看起来我需要一些 MySQL 特定的设置。
这是导致服务器冻结的单个 MySQL 查询。我想限制分配给该特定查询的资源。
MySQL 无法告诉 mysqld 服务器对某些查询使用较低优先级或较少资源。你需要专注于这些事情:
使有问题的查询花费更少的时间。这可以通过其中一种或两种方式来完成。
一个。将其分解为较小的查询
湾。创建适当的索引以使其更快
使其对其他查询的干扰更少。
您没有向我们展示查询,因此该答案的其余部分基于猜测。
1a:以几百或几千条记录为单位进行更新。重复这些(较短的)更新,直到您的任务完成。一旦每个段运行,它就会离开并让其他查询完成。
1b:阅读有关使用EXPLAIN
和使用索引以加快查询速度的信息。让您的大查询更快。索引可以大大加快您的WHERE
条款。
2:您可以为系统上的查询设置隔离级别,这样它们就不会相互依赖。这可能让他们更优雅地共享服务器。在发出更新作业阻止的查询之前发出查询以将隔离级别设置为正确。READ UNCOMMITTED
这将使他们完成,并使用更新作业完成之前存在的数据,而不是等待作业。
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
在您发出其他查询之前。
如果你控制整个服务器,可能更容易设置READ UNCOMMITTED
为默认隔离级别。