我需要提供有关成员登录的以下数据作为示例:
LAST HOUR 654
LAST DAY 15,648
LAST WEEK 109,536
LAST MONTH 460,051
LAST YEAR 5,520,614我想知道在MySQL DB中保存这些信息的表的最佳结构是什么。
目前,我正在考虑仅仅存储:
user datetime我预计随着时间的推移,这会变得非常大,而且查询速度也会变慢。
是否有更好的方法来构造一个表格来获取登录信息-小时、日、周、月、年等?
发布于 2014-03-06 06:48:05
$current_time = strtotime(date('d-M-Y g:i:s A'));
$last_hour = $current_time - 3600;
$last_day = $current_time - (3600*24);
$last_week = strtotime("-1 week");
$last_month = strtotime("-1 month");
$last_year = strtotime("-1 year");
// now count
// count for last hour
$sql = "SELECT COUNT(user_id) AS cnt FROM `your_table` WHERE datetime>='$last_hour' ";
// count for last day
$sql = "SELECT COUNT(user_id) AS cnt FROM `your_table` WHERE datetime>='$last_day' ";
// count for last week
$sql = "SELECT COUNT(user_id) AS cnt FROM `your_table` WHERE datetime>='$last_week' ";
// count for last month
$sql = "SELECT COUNT(user_id) AS cnt FROM `your_table` WHERE datetime>='$last_month' ";
// count for last year
$sql = "SELECT COUNT(user_id) AS cnt FROM `your_table` WHERE datetime>='$last_year' ";发布于 2014-03-06 06:31:37
在日志表的每一行重复用户信息是非常糟糕的,请看使数据库规范化
您还可以使用时间戳值,并在添加行时让MySQL 初始化/自动设置作为字段。
所以你的结构看起来可能是:
user_tbl
- uid (int)
- name
- datax
- etc
log_tbl
- uid (int)
- login_time (datetime/timestamp)现在,要获取登录信息,取决于您使用的是哪种语言,可以解析时间戳。在PHP中:
$time = // timestamp value from database使用PHP 日期()函数
$date = date('m/d/Y', $time);其他价值
$year = $time/31556926 % 12; // to get year
$week = $time / 604800 % 52; // to get weeks
$hour = $time / 3600 % 24; // to get hours
$minute = $time / 60 % 60; // to get minutes
$second = $time % 60; // to get seconds发布于 2014-03-06 06:43:17
我会像你建议的那样做,只是用户和日期时间字段(不称为日期时间)。将日期时间的缺省值设置为CURRENT_TIMESTAMP。您可以根据日期时间对数据进行归档或分区,但是MySQL将处理数百万行没有问题。在datetime字段上设置一个索引。然后使用视图进行计数,如下所示:
SELECT COUNT(YEAR(testcol)) AS CNT FROM test.test;https://stackoverflow.com/questions/22216581
复制相似问题