2012-03-07 39 views
3

我需要跟蹤所有用戶的登錄信息,以便每次登錄時都有他們這樣做的時間戳。這樣做的最有效和最好的方法是什麼?MySQL + PHP - 每次用戶登錄時存儲時間戳的最佳方法

我一直都是通過在用戶表中存儲一個文本字段來存儲由字符分隔的unix時間戳。每次登錄時,都會將另一個時間戳添加到結尾。

1243453458|1255476933|1263453743|1318495068| 

這是一個不好的方法嗎?每次用戶登錄時,我都會想到一個單獨的登錄表,並且會在檢索此信息時導致數據庫更加緊張。

請記住,我在PHP中處理這些時間戳,並使用jQuery從數據創建圖形。

回答

5

是的,那存儲任何東西,包括時間戳的可怕方式,並有更好的方法來做到這一點。即使是最簡單的表會給你更好的性能:

user_id (int) | last_login (timestamp) 
  • 要存儲的時間戳的字符串。這對於存儲,檢索和更新完全是低效的;再加上你最終會遇到列限制。
  • 嚴重優化數據類型用於這種目的 - MySQL服務器開發人員傾向於知道有關存儲數據有效的一兩件事。
  • 數據庫命中這樣一個具有固定大小行的小表,將變得可以忽略不計 - 與具有需要在應用程序中進一步處理的可變長度字符串的表相反。

換句話說,通過嘗試優化應用程序(基於錯誤的假設 - 「另一張表太緊張」),您已經認識到它,提出了一個全面的低效解決方案。不要讓事情過於複雜;如果有疑問,請分析這兩個選項並親自查看。

+0

很好的答案,謝謝。我想我對存儲效率有這種誤解。 – BadHorsie 2012-03-07 11:56:30

0

在MySQL中,你可以使用一個TIMESTAMP

對如何配置它

編輯一起來看看here:您的管道分隔的做法是沒有好處的。您可以有一個存儲各種用戶事件的交易表。

4

你可能會更好,把它變成一個單獨的表在數據庫中,這樣的:

members_logins 
member_id (int) | timestamp (timestamp) 

這將會意味着它會更容易做業務。

+0

這絕對是最好的辦法 – scibuff 2012-03-07 11:44:28

+0

我知道這是最好的辦法,我只是不確定值得存儲數百萬行。好的,如果我想限制表格僅存儲用戶的最後50次登錄,那麼最簡單的方法是什麼? – BadHorsie 2012-03-07 11:51:45

+0

'DELETE FROM members_login WHERE timestamp <(SELECT timestamp FROM members_logins ORDER BY timestamp LIMIT 50,1)' – fire 2012-03-07 11:59:28

相關問題