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