2010-08-06 160 views
1

目前,我在mysql中有一個記錄事務的表。這些交易可能會由用戶更新 - 有時候不會,有時甚至經常更新。但是,我需要跟蹤對此表中每個字段的更改。所以,我現在所擁有的是一個名爲'is_deleted'的表中的TINYINT(1)字段,當用戶更新事務時,它將舊記錄的is_deleted字段更新爲1,並插入一個全新的紀錄。MySql表結構

這一切運作良好,因爲我只需要運行下面的SQL語句來獲得當前所有記錄:

SELECT id, foo, bar, something FROM trans WHERE is_deleted = 0; 

但是,我擔心的是此表將增長不必要的大隨着時間的推移,我因此考慮實際刪除舊記錄並將其歸檔到另一個表(trans_deleted)。這意味着轉換表只包含「實時」記錄,因此可以使SELECT查詢速度更快一些。

但是,這意味着更新記錄會稍微長一些,因爲它將運行3個查詢: 1.插入到trans_deleted舊記錄; 2.從trans中刪除WHERE id = 5; 3.插入反式新記錄

因此,更新記錄需要多一點工作,但讀取會更快。

對此有何看法?

+0

這裏有一個廣泛的討論這裏... http://stackoverflow.com/questions/3091293/making-a-row-inactive-in-mysql – 2010-08-06 12:29:01

回答

1

我建議表反式table_revision

反式有場IDcurrent_revision修訂有場IDTRANSIDfoo and bar

要獲得所有經常項目則:

SELECT r.foo, r.bar FROM trans AS t 
    LEFT JOIN revision AS r ON t.id = r.trans_id 
    WHERE t.current_revision = r.id 

如果你現在把指標上r.id和r.trans_id歸檔woun't讓它爲你快得多。

0

通常情況下,你閱讀的次數比你寫的要多得多(而且你還說有些記錄可能永遠不會改變)。所以這是歸檔表的一個原因。

還有另一個:你還必須考慮程序員的時間,而不僅僅是處理器時間:)如果你將存檔行保存在同一個表中,你必須記住並且注意這一點在您對該表執行的每個查詢中。不要說未來可能需要處理桌面的程序員......即使沒有任何速度改進,我也會建議僅基於這個因素的歸檔方法!