2010-01-12 58 views
0

我有一個Web應用程序,其中一個功能是不斷將行附加到大表中。該行看起來大約是這樣的:從不斷追加的表格中可靠地讀取

id bigint not null primary key 
visited datetime not null 
ip_address 
# Other fields 

這是一個跟蹤表,因爲你可能已經猜到了。這個表 的使用是完全附加的,也就是說,在插入 之後沒有修改行。

但是,我們的數據量顯着增加,並且需要 將統計處理單獨處理到其他表中,而不是立即查詢數據並對其進行計算。基本上,我已經寫了一個獨立的程序 其中大約做這(僞代碼)

while (true) { 
    Select rows from tracking table where id > last_id 
    Feed rows to stats processing thread 
    last_id = max(id from rows) 
    sleep some amount of time (~30sec is what I'm currently using) 
} 

不過,我擔心我會缺失行。由於 在我選擇跟蹤表中的行的時候會出現ID差距,因此某些行ID有 已被保留,但這些事務中的數據尚未提交,並且在 下一個循環中已經存在轉移到更新的ID。

我一直想知道如何協調這一點,因爲當計算 統計數據不是真正的選項時缺失數據。

這裏是我一直在折騰各地的各種選項:

  1. 重新設計上有點像參觀時間

  2. 不要使用關係數據庫表或查詢,但一些數據排隊系統?

  3. 查詢上的時間差表,即WHERE ID> last_id並參觀< NOW() - 一段時間

也有可能有我沒有考慮的選擇。什麼是最好的 方式查詢表,所以我不會錯過任何數據?

回答

0

這裏是你可以這樣做(像你的#2)的一種方法:

  1. 複製數據到一個單獨的「倉庫」的數據庫。
  2. 執行ETL以便您的數據在您的查詢/統計分析中更優化地在您的倉庫中進行規範化。對於每種記錄類型,請添加一列作爲「狀態」標誌,指示記錄是否已被分析引擎讀取。
  3. 讓您的分析在讀取記錄後更新「讀取」列。
+0

感謝您花時間回答:)我決定實施您的答案變體。因爲在存儲和處理數據之間的低延遲是一個優先事項,所以我仍然要從原始表中讀取(跳過複製和ETL),但是我會爲分析引擎保留另一個表來記錄它的ID看到。 – Crast

+0

@Crast聽起來不錯,祝你好運! –