2013-11-03 61 views
0

這裏是我的問題自由創建例如:如何存儲多少數據在數據庫中,自動刪除舊

每15秒一次我運行一個PHP腳本檢查的+5服務器的狀態。它得到了pingstatus,versionmotd。數據應該存儲兩個星期,在這段時間之後它可以被刪除。

目前,我將它保存這樣的:

Table 1: 
server_ID | name | ip | last_update 

Table 2: 
ID |  server_ID | status | ping | version | motd | timestamp 

我想用這種方式,沒有加倍,我可以easyly重命名服務器或更改其IP地址。

但是,我應該如何使舊行的下降?每次腳本運行時(每15秒)是否這樣做太多了? 14*24*60*4 = 80640 rows per server for the two weeks

或者我該如何存儲數據,我能夠獲得最新的數據以及數據以顯示2周的折線圖?

也許是第三個表,它有小時數據。


編輯:

謝謝您的解答。這是怎麼回事:

在15秒的更新我把表1中的所有數據,但我更新它,所以它只有一個服務器每行。

然後,我每小時使用一次這個觸發器,並將當前數據複製到一個新表中並刪除超過2周的所有內容?

目前我已經將表1中的server_ID和表2中的ID設置爲主鍵,是否有充分的理由將時間戳設置爲主鍵?

回答

1

首先,讓我們來計算每5秒後的2周時間輸入的記錄數

60/5 = 12 times in a min 
12 * 60 = 720 times in an hour 
720 * 24 = 17280 times in a day 
17280 * 14 = 241920 times two weeks 

241920 * 5 = 1209600 records 

有數據的一大塊每天輸入。我假設你正在使用MySQL數據庫。既然你想要在折線圖中顯示最新的數據。您必須創建事件觸發器。

事件觸發器

僅當您有權限執行時才使用事件觸發器。因此,首先你要設定的事件觸發上爲下:

SET GLOBAL event_scheduler = ON; 

現在你的事件觸發上創建了以下事件觸發做的事情:

CREATE EVENT 
    event_name 
ON SCHEDULE AT 
EVERY 5 MINUTE 
DO 
    DELETE 
    FROM 
    Database2 
    WHERE 
    timestamp < (CURRENT_TIMESTAMP() - (60*60*24*14)) 

將計劃每隔5分鐘它將從當前時間和日期戳中刪除2周齡的記錄。希望這能解決你的問題。由於表格只有2個星期的記錄,每5分鐘刪除一次舊記錄,插入過程每5秒鐘完成一次。

編輯的問題

編輯的問題已經改變了很大的不同。現在在表2中不斷輸入數據。現在每隔15秒鐘更新一次table1,並且每創建一個新表格並刪除舊的條目。我不明白你想達到什麼。但是,我會在最後回答關於主鍵的問題。

什麼是主鍵

  • 主鍵約束唯一標識數據庫表中的記錄。

  • 主鍵必須包含唯一值。

  • 主鍵列不能包含NULL值。

  • 每個表都應該有一個主鍵,每個表只能有一個主鍵。

現在它取決於你的需求,如果你想在一個時間戳的條目應該在那裏,然後將其更改爲時間戳,但如果你想爲單一服務器的單一入口,然後將其更改爲服務器。但是,我推薦你另一種方式,即你創建一個單獨的列作爲主鍵的ID,並創建索引的唯一鍵與兩列的組合,即server_id和時間戳

+0

謝謝你,你已經幫了我很多。我更新了我的問題,也許你可以給我評論這種方式。 – user2693017

+0

@ user2693017根據編輯的問題提供了答案 – Vineet1982

+0

嘿,我以爲我保存在一個表中,但是當php腳本運行時,它不會創建一個新條目,它只會更新行。然後,我每小時運行一個腳本,將第一個表中的行復制到另一個表中,並刪除第二個表中的舊信息。 根據主鍵,是不是更容易通過id而不是時間戳對數據庫進行排序?所以它只需要檢查已過時的第一個id,並刪除它和每個previeus。 – user2693017

0

你的問題是如何刪除行,對不對? 這是可能的刪除...

DELETE FROM表WHERE X = Y

0

我假設你正在使用它支持分區數據庫(如MySQL的「= 5.5 InnoDB的)。在這種情況下,我會將timestamp列添加到第二個表的主鍵(稱Database2的意思是table2,對嗎?)並創建日常分區。然後,刪除較舊的數據只需要放棄2周以上的每日分區(這應該是一個非常快速的操作)。

如果您需要顯示帶有小時分辨率的2周圖表,我會建議首先檢查您的當前設置是否不夠快,並且只有在它太慢時才創建一個額外的表格,您將存儲聚合數據(可能會生成一些工作人員查詢主表例如每隔幾分鐘)

0

由於沒有提到必須使用基於SQL的數據庫,只是爲了好玩,您可以避免將其存儲在關係數據庫結構中。

一個選項將是一個哈希,但也許你也可以使用分類集,如Redis。使用排序集可以非常快速地添加,刪除或更新元素(時間與元素數量的對數成比例)。

排序集的每個成員都與分數相關聯,分數用於排序集從最小到最大的分數。雖然成員是獨特的,但分數可能會重複。

您的分數將是大紀元時間(或類似),並且該會員可能是您希望存儲的數據的JSON對象。

由於此類操作如此之快,您可以輕鬆地回調所有JSON對象並對自己進行排序。您需要將時代時間存儲在JSON對象中以確保唯一性。請注意,相對於Redis可以處理的數量,每個服務器80640行很小。要添加:

ZADD yourset 1383553120 "<JSON OBJECT>" 

第一個參數是當前的時代。由於您知道當前的紀元時間,因此您可以輕鬆刪除所有過舊的紀錄。刪除:

ZREMRANGEBYSCORE yourset -inf 1382344314 

最後的爭論應該是兩週前從現在開始的大紀元時間。

JSON and PHP play nice,所以它可能是你可以看看的東西。

相關問題