是否可以向mySQL發出(昂貴但低優先級的)SELECT查詢,以便如果UPDATE查詢出現在隊列中,mySQL將立即終止查詢,並重新添加到隊列的末尾?MySQL中的極端低優先級SELECT查詢
如果重新添加到隊列是不可能的,我很高興簡單地殺死SELECT查詢。
是否可以向mySQL發出(昂貴但低優先級的)SELECT查詢,以便如果UPDATE查詢出現在隊列中,mySQL將立即終止查詢,並重新添加到隊列的末尾?MySQL中的極端低優先級SELECT查詢
如果重新添加到隊列是不可能的,我很高興簡單地殺死SELECT查詢。
不,不是真的。
我不確定你到底需要什麼,但我的猜測是你需要優化SELECT來不鎖定整個表,或者讓複製進行,並在從屬而不是主控上執行SELECT。
理論上你可以找出SELECT查詢的MySQL進程ID是什麼,並在你的應用程序發送KILL之前,你做任何更新。
好吧,也許可以。
客戶端運行的應用程序偶爾會拋出查詢,這些查詢完全會導致服務器上其他所有操作的性能下降。我們已經進行了監控,如果我們有適合的人員可以做出反應,我們可以手動處理該查詢,並通過這種方式來了解應用程序中的問題。
但是爲了防止出現重大中斷,如果沒有人在場,我們有一個自動腳本終止長時間運行的查詢,所以如果沒有人在15分鐘內干預,服務器會恢復。
遠非理想情況,但這正是該項目目前所處的位置,並且確實可以防止偶爾出現的過去中斷。我們只能通過修復問題查詢來加快速度。
無論如何,你可以運行類似的東西,查看正在運行的查詢,並確認何時有一個更新正在等待其中一個大型選擇,並且在這種情況下,它會終止選擇。一分鐘做幾次這種檢查並不是太昂貴。我想在運行之前做一些測試。
因此,您是否可以通過這種方式解決您的問題取決於您的容差是多長時間可以延遲更新。每分鐘運行一次(就像我們這樣做)完全沒有問題。每秒運行一次會顯着增加整體負載。你需要測試你能夠在這些點之間合理的距離。
這種方法意味着在選擇被推開之前會有一些延遲,但它可以節省您不得不在構建應用程序中的許多不同位置時使用該邏輯。
-
關於分手查詢,你最有可能最好限制在您的查詢,而不是通過抵消和限制通過ID範圍從一個或多個表的塊。
-
也有可能根據你的分區表,以便查詢不作爲嚴重衝突是很好的解決方案。確保你很好地掌握了你在做什麼。
即使我只鎖定了一部分表格(我將不得不考慮),但我仍然不願承擔我們的UPDATE之一。這是一個非常低優先級的掃描,用於查找錯誤並收集統計數據。我已經考慮使用OFFSET和LIMIT進行塊掃描,但是對於我以前的問題的答案表明,這幾乎與靠近表末尾的OFFSET完全掃描一樣昂貴。 http://stackoverflow.com/questions/7389759/memory-efficient-built-in-sqlalchemy-iterator-generator – Paul
我會研究複製,但它似乎是矯枉過正,因爲它是一個非常大的表。我只是不想讓查詢運行而不是保持更新。 – Paul
也許你可以拆分你的查詢,但基於索引列和WHERE字段 – Evert