2011-08-19 70 views
3

我有一個表格,當一行被創建時,它會被激活24小時,有一些寫入和大量的讀取。然後它在24小時後變爲非活動狀態,並且不會有更多的寫入,只有一些讀取(如果有的話)。將不活動的行移動到另一個表中?

將這些行保留在表中還是在它們變爲非活動狀態(或通過批處理作業)移動到單獨的表中時將其移動更好?在性能方面思考。

回答

3

這很大程度上取決於您的表格有多大,但是如果它永遠長大,並且每天有很多行,那麼將舊數據移動到另一個表格是一個好主意。有幾種不同的方法可以實現這一點,最好取決於您的應用程序和數據訪問模式。如你所說

  1. 從本質上講,當一個行將成爲「老」,插入到存檔表,並從當前表中刪除。

  2. 每天(或者每週或每個月,根據數據集的大小而定)創建一個新表,並且不用擔心移動舊行。訪問舊數據時只需查詢舊錶,但在當前,您只能訪問當前表。

  3. 有一個「今日」表和一個「全時間」表。複製兩個表中的「今日」行,使其與觸發器或其他機制保持同步。當一行變老時,只需從「今日」表中刪除,留下「全時間」行。

#2的一個優點,可能不是很明顯,我相信MySQL索引可以針對只讀表進行優化。因此,通過編寫從未的舊錶,您可以利用這種額外的優化。

3

通常,在正確的RDBMS中的表之間移動行通常不是必需的。

我不熟悉mysql的細節,但你應該做的罰款下列要求:

  • 確保您的時間戳列索引
  • 此外,還可以使用active BOOLEAN default true
    • 每天批量運行以標記> 24小時舊行無效
    • 使用時間戳列的部分索引,以便只標記有效的行被索引
    • 請記住在您的條件下創建時間戳和活動= TRUE命中索引。大量使用EXPLAIN。
1

這一切都取決於易於編程和性能之間的平衡。性能明智,是的,它肯定會更快。但是速度增加是否值得這個努力很難說。

我已經在使用數百萬行完美運行的系統上工作過。但是,如果數據不斷增長,它最終會成爲一個問題。

我一直在爲存儲自動化設備的事務日誌記錄的數據庫工作。它每天產生數十萬個事件。一年後,查詢不會以可接受的速度運行。我們現在保留主表中最後一個月的日誌值(數百萬行仍然存在),並將舊數據移到歸檔表中。

應用程序的任何功能都不會在歸檔表中查找(如果您執行事務日誌的查詢,它將不會返回任何結果)。它只能用於緊急情況,並且只能查詢任何獨立的數據庫查詢工具。由於檔案有超過一億行,而且這種緊急用途的性質通常是無法解決的(因此大多數是未索引的)查詢,所以它們可能需要很長時間才能運行。

0

還有另一種解決方案。讓另一個表只包含活動記錄(tblactiverecords)。當活動記錄的數量非常小時,您可以只進行內部連接並獲取活動記錄。這應該需要很少的時間,因爲默認情況下主鍵在mysql中被索引。當你的行變爲非活動狀態時,你可以從tblactiverecords表中刪除它們。

然後,

create table tblactiverecords (tblrecords_id primary key); 

你可以做

select data from tblrecords join tblactiverecords on tblrecords.id = tblactiverecords.tblrecords_id; 

獲得是活躍的所有數據。

相關問題