我有一個表格,當一行被創建時,它會被激活24小時,有一些寫入和大量的讀取。然後它在24小時後變爲非活動狀態,並且不會有更多的寫入,只有一些讀取(如果有的話)。將不活動的行移動到另一個表中?
將這些行保留在表中還是在它們變爲非活動狀態(或通過批處理作業)移動到單獨的表中時將其移動更好?在性能方面思考。
我有一個表格,當一行被創建時,它會被激活24小時,有一些寫入和大量的讀取。然後它在24小時後變爲非活動狀態,並且不會有更多的寫入,只有一些讀取(如果有的話)。將不活動的行移動到另一個表中?
將這些行保留在表中還是在它們變爲非活動狀態(或通過批處理作業)移動到單獨的表中時將其移動更好?在性能方面思考。
這很大程度上取決於您的表格有多大,但是如果它永遠長大,並且每天有很多行,那麼將舊數據移動到另一個表格是一個好主意。有幾種不同的方法可以實現這一點,最好取決於您的應用程序和數據訪問模式。如你所說
從本質上講,當一個行將成爲「老」,插入到存檔表,並從當前表中刪除。
每天(或者每週或每個月,根據數據集的大小而定)創建一個新表,並且不用擔心移動舊行。訪問舊數據時只需查詢舊錶,但在當前,您只能訪問當前表。
有一個「今日」表和一個「全時間」表。複製兩個表中的「今日」行,使其與觸發器或其他機制保持同步。當一行變老時,只需從「今日」表中刪除,留下「全時間」行。
#2的一個優點,可能不是很明顯,我相信MySQL索引可以針對只讀表進行優化。因此,通過編寫從未的舊錶,您可以利用這種額外的優化。
通常,在正確的RDBMS中的表之間移動行通常不是必需的。
我不熟悉mysql的細節,但你應該做的罰款下列要求:
active BOOLEAN default true
列
這一切都取決於易於編程和性能之間的平衡。性能明智,是的,它肯定會更快。但是速度增加是否值得這個努力很難說。
我已經在使用數百萬行完美運行的系統上工作過。但是,如果數據不斷增長,它最終會成爲一個問題。
我一直在爲存儲自動化設備的事務日誌記錄的數據庫工作。它每天產生數十萬個事件。一年後,查詢不會以可接受的速度運行。我們現在保留主表中最後一個月的日誌值(數百萬行仍然存在),並將舊數據移到歸檔表中。
應用程序的任何功能都不會在歸檔表中查找(如果您執行事務日誌的查詢,它將不會返回任何結果)。它只能用於緊急情況,並且只能查詢任何獨立的數據庫查詢工具。由於檔案有超過一億行,而且這種緊急用途的性質通常是無法解決的(因此大多數是未索引的)查詢,所以它們可能需要很長時間才能運行。
還有另一種解決方案。讓另一個表只包含活動記錄(tblactiverecords)。當活動記錄的數量非常小時,您可以只進行內部連接並獲取活動記錄。這應該需要很少的時間,因爲默認情況下主鍵在mysql中被索引。當你的行變爲非活動狀態時,你可以從tblactiverecords表中刪除它們。
然後,
create table tblactiverecords (tblrecords_id primary key);
你可以做
select data from tblrecords join tblactiverecords on tblrecords.id = tblactiverecords.tblrecords_id;
獲得是活躍的所有數據。