我有一个需要每X分钟运行一次的进程来更新某些信息。查询耗时10秒、20秒甚至1分钟都无关紧要。但重要的是,例如,信息至少每10分钟更新一次。
由于查询速度较慢,并且服务器正用于其他查询,因此会影响其他用户。这就是我正在努力解决的情况。
我会对运行查询的任何进程执行cpulimit,但是占用所有资源的进程是MySQL服务器本身,因此似乎我需要一些特定于MySQL的设置。
导致服务器冻结的是单个MySQL查询。我想限制分配给该特定查询的资源。
发布于 2017-10-14 23:02:07
MySQL无法告知mysqld服务器对某些查询使用较低优先级或较少的资源。相反,你需要专注于这些事情:
a.将其分解为较小的查询
b.创建适当的索引以使其更快
您没有向我们展示查询,所以这个答案的其余部分都是基于猜测的。
1a:以几百或上千条记录为单位进行更新。重复这些(较短的)更新,直到任务完成。一旦每个段运行,它就会退出,并让其他查询完成。
1b:阅读有关使用EXPLAIN和使用索引提高查询速度的信息。让你的大查询更快。索引可以大大加快WHERE子句的执行速度。
2:你可以在你的系统上设置查询的isolation level,这样它们之间就不会有太多的依赖关系。这可能会让他们更优雅地共享服务器。在发出被更新作业阻塞的查询之前发出query to set the isolation level to READ UNCOMMITTED。这将让它们完成,并使用更新作业完成之前存在的数据,而不是等待作业。
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;在您发出其他查询之前。
如果您控制整个服务器,则将READ UNCOMMITTED设置为默认隔离级别可能会更容易。
https://stackoverflow.com/questions/46745749
复制相似问题