【问题标题】:How to give priority to certain queries?如何优先考虑某些查询?
【发布时间】:2012-09-03 21:00:43
【问题描述】:

在某些情况下,当多个后端进程碰巧同时运行时(队列管理是另外一回事,我可以这样解决,但这不是这里的问题), 我得到General error: 1205 Lock wait timeout exceeded; try restarting transaction ROLLING BACK

优先级较低的进程是锁定表的进程,因为它比高优先级的进程早几分钟启动。

如何让查询优先于已运行的进程?

希望它足够清楚。

【问题讨论】:

    标签: mysql locking thread-priority


    【解决方案1】:

    一旦查询开始执行,就不能暂停/中断。唯一的例外是在数据库管理级别,您实际上可以强制停止查询(如果您愿意,可以将其视为杀死 Windows 中正在运行的进程)。但是你不想这样做,所以算了吧。

    您最好的选择是使用低优先级分块操作。基本上,这意味着如果 LOW PRIORITY 上的查询执行时间过长,请考虑使用哪些方法可以更快地将其拆分,而不会在数据库中创建孤立数据或非法数据。

    一个非常基本的用例是想象一个插入 10,000 个新行的插入。通过“分块”插入,以便它使用较小的数据集(即一次 500 个)多次运行插入,每个将更快地完成,因此允许以更及时的方式执行任何非低优先级操作.

    方法

    将某项设置为低优先级就像添加 LOW_PRIORITY 标志一样简单。

    INSERT LOW_PRIORITY INTO xxx(a,b,c,) VALUES()

    UPDATE LOW_PRIORITY xxx SET a=b

    DELETE LOW_PRIORITY FROM xxx WHERE a="value"

    【讨论】:

    • 好的...如何将查询标记为低优先级(您可以将其添加到答案中吗?)
    • 已添加,不要忘记您还需要将操作分成更小的位以使其工作,一旦查询开始,它必须完成才能执行其他操作。 LOW PRIORITY 将只允许在 LOW PRIORITY 查询完成后且在执行下一个 LOW PRIORITY(即分块查询的第二个)之前执行其他普通/高优先级查询。
    • @Lee 我唯一要添加的是有关low_priority_updates 选项dev.mysql.com/doc/refman/5.0/en/… 的信息
    • 我想到了 Maksym,但是我更喜欢对这些东西进行精细控制,所以我不想使事情复杂化,当然使用该全局设置可能会带来其他问题,具体取决于实现。但如果它适合应用程序的需求,它绝对是一个可行的替代方案,特别是如果您将不得不重新考虑大量查询。
    • 我不明白这个答案,您正在推进将查询拆分为更简单的查询,但最后您编写了一些代码来满足提问者的要求,但没有更好的描述......跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 2021-07-13
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 2019-09-20
    • 2023-03-15
    相关资源
    最近更新 更多