2012-03-07 133 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

相关问题