是否有可能以这样的方式向mySQL发出(昂贵但低优先级的)SELECT查询,如果队列中出现UPDATE查询,mySQL将立即终止查询,并将其重新附加到结尾队列?
如果无法重新附加到队列,我很高兴只是杀死SELECT查询。
答案 0 :(得分:2)
不,不是真的。
我不确定你需要什么,但我的猜测是你需要优化SELECT以不锁定整个表,或者进行复制并在slave上而不是master上执行SELECT。
理论上,您可以找出SELECT查询的MySQL进程ID,并在您的应用程序中发送KILL之前进行任何更新。
答案 1 :(得分:0)
嗯,有点可能。
客户端运行的应用程序偶尔会抛出完全破坏服务器上其他所有内容性能的查询。我们有监控,如果我们有一个合适的人准备好做出反应,我们可以手动处理该查询,并通过这样的方式了解应用程序中的问题。
但是为了防止重大中断,如果没有人在场,我们有一个自动脚本可以终止长时间运行的查询,因此如果没有人可以在15分钟内进行干预,服务器就会恢复。
远非理想,但这是该项目目前所处的位置,它确实可以防止偶尔发生的长时间停电。我们只能通过修复问题查询来快速移动。
无论如何,你可以运行类似的东西,查看正在运行的查询,并识别你有一个等待你的一个大选择的更新,并在那种情况下它杀死选择。每分钟进行几次这种检查并不是太贵。我想在跑步之前做一些测试。
因此,您是否可以通过这种方式解决问题取决于您的延迟可以延迟多长时间。每分钟运行一次(就像我们一样)完全没问题。每秒运行一次会显着增加整体负载。你需要测试你能在这些点之间合理地走多远。
这种方法意味着在select被推出之前会有一些延迟,但它可以节省你必须在应用程序中的许多不同位置构建这个逻辑。
-
关于分解您的查询,您最有可能通过查询中的一个或多个表的id范围来限制块,而不是通过偏移和限制来限制。
-
根据对表的分区,可能还有很好的解决方案,这样查询就不会发生严重冲突。尽管如此,请确保您对自己正在做的事情有很好的把握。