2011-09-12 42 views
1

所以我們有一個數據庫。每隔一段時間我們都會添加一個新的數據集,最舊的數據集應該被刪除。遞增整個數據庫的值

說數據庫是6月初:18條記錄,6月下旬:15條記錄,8月:23條記錄。當我們添加下一個記錄時,我們要刪除6月初的記錄。但是添加新數據並不完全正常。 我的第二個想法是爲每個記錄創建一個「陳舊」字段,並在添加新數據集之前,將所有「陳舊」字段加1,然後刪除所有陳舊數據爲3的數據。

我擔心這不是最佳的方式,但我不確定這很重要,因爲它是一個很小的數據庫,很少更新。也就是說,我肯定願意提供更好的算法來實現這一點。

+0

是的,你應該選擇退出清理,因爲它煩死了mysql在所有 – ajreal

+0

我很抱歉,什麼? – aslum

+0

如果你的數據庫很小,你必須定期清理舊記錄,以使其更好地工作 – ajreal

回答

0

user937146一點點幫助,我想我已經得到了解決。基本上

$query = "SELECT MIN(timestamp) FROM new_items WHERE type = 'Book' "; 

然後,它只是一個以該時間戳,加上一個小時(因爲數據可能需要超過一秒鐘上傳,可能1分鐘就足夠了),然後刪除一切從數據庫比舊事那個時間戳。

2

我假設您的數據存儲在每個報告中都有一個時間戳記(日期)列,並且您總是希望刪除x(本例中爲3個月)的數據。如果是這樣,你可以考慮使用mysql的DATEDIFF函數。

例如,它可能是這個樣子:

DELETE from table1 WHERE datediff(CURRENT_DATE(), datecol) > 89 

http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_datediff

+0

問題是我不知道最早的數據將會多大。可以跳過幾個月,或者一個月內可能會有4次更新。 – aslum

+0

嗯..你可以通過使用'MIN'函數獲取現有記錄的最早日期,並使用'LAST_DAY'指定該月的最後一天。然後,這會在最舊的月份的最後一天讓您午夜,因此您需要添加一天,以便刪除在最後一天輸入的記錄。 這可能與此有關嗎? 'SET @olddate =(SELECT(LAST_DAY(MIN(從表1 datecol)+ INTERVAL 1天));從 表1 WHERE datecol <@ olddate' – user937146

+1

同樣,可以有在同一個月多次更新,但我認爲DELETE 「MIN」是要走的路,找到最短日期,增加一小時(以防萬一記錄不是完全同時添加),並刪除比這更早的數據。 – aslum

0

每月是否總是?

UPDATE table SET status = "oldness" WHERE date_inserted <= NOW() - INTERVAL 3 MONTH 
+0

可悲的是,一個月內可能有多個更新,或者幾個月可能完全跳過。 – aslum

+0

沒問題。我發佈的這個例子將在3個月大的所有行中運行。我的意思是,可能有一組數據可以在一個月中開始,並在下個月中旬結束?如果是,您可能需要添加一列來區分一組數據。如果不是,我的解決方案將工作。 – Andre