2012-11-20 45 views
0

我有一個大的增長表(目前有1400萬行和計數)。它是來自日誌的「錯誤」列表。其中一些錯誤是我想要在上游修復時過濾的已知問題。在表格中,我有兩個'CheckedForFilter'和'Filtered'我想在10,000行塊中進行如下操作。MySQL - 在大型表的同一個子集上運行多個更新查詢

1) Select on 10,000 rows (where 'CheckForFilter' is false) 
2) Run a series of queries that set the 'Filtered' bit in certain criteria is true 
3) After the last query runs set the 'CheckForFilter' bit to true 

可以設置「過濾」位的查詢列表當前爲5,但我認爲隨着時間的推移它會增長。我的核心問題是我不知道如何每次選擇同一組行。我需要將查詢保持爲可管理的大小,因爲運行時間過長的查詢會延遲服務器複製。

+0

嗯..這聽起來像也許有一個正則表達式模式,將做你的過濾?如果有多個模式 - 那麼你可以將它們存儲在另一個表中,然後在遊標中動態地比較它們。 – Randy

+0

另一個想法 - 對CheckedForFilter值應用什麼過濾器(或更改爲更多值)以指示哪些過濾器已被檢查 - 然後您不太在意每次運行相同的確切設置。 – Randy

回答

2

如果你在錯誤表上有一個ID字段,你可以這樣做。

創建一個「過濾器」表,其中將包含要檢查的下一個10,000個ID的最小和最大ID值。在這個表中有一個名爲「Checked」的標誌,它確定是否所有的過濾器都被檢查過。

運行您的過濾器的查詢,其中在錯誤表中的ID是在「選中」域= 0

一旦完成,更新CheckedForFilters在你的「過濾器」表中的最小和最大ID值之間標記在來自「過濾器」表的最小和最大ID範圍內的這些記錄上。

更新「過濾器」表並設置「檢查」字段= 1。如果您願意,也可以存儲日期和時間。

直到完成後,運行此下一個10,000條記錄。

這也可以讓你保留過濾器運行的歷史。如果您想要,您還可以在單​​獨的表格中存儲針對這些批次中的每個批次運行的過濾器。

+0

謝謝..我曾經想過這樣的事情,或者創建一個可容納10,000個密鑰的表格。發佈請求時,我希望找到能夠鎖定到一組行並對其執行多個查詢的東西,但當然這會做出一個很好的替代 – personalt

相關問題