Php 这是活动日志的实用概念吗?

Php 这是活动日志的实用概念吗?,php,mysql,Php,Mysql,我想使用一个InnoDB MySQL表为我的PHP站点创建一个活动日志。任何访问该网站的人都将在表中插入一条新记录,这将记录 他们的IP地址 他们登录的帐户的ID,如果未登录,则为null 他们向服务器发出的请求 收到请求的日期和时间 用户代理已发送,但仅当PHP脚本确定它是bot时,否则为空 同时,我可以用这张桌子 确定每个页面每年/每月/每天收到的点击量等 确定每年/月/日/等的独特访客数量 如果可行,可以使用PHP脚本动态检索以前的信息,如果愿意,可以过滤掉bot请求 我对下表有一些问题和

我想使用一个InnoDB MySQL表为我的PHP站点创建一个活动日志。任何访问该网站的人都将在表中插入一条新记录,这将记录

他们的IP地址 他们登录的帐户的ID,如果未登录,则为null 他们向服务器发出的请求 收到请求的日期和时间 用户代理已发送,但仅当PHP脚本确定它是bot时,否则为空 同时,我可以用这张桌子

确定每个页面每年/每月/每天收到的点击量等 确定每年/月/日/等的独特访客数量 如果可行,可以使用PHP脚本动态检索以前的信息,如果愿意,可以过滤掉bot请求 我对下表有一些问题和理由:

CREATE TABLE `activity` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `ip` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `account` int(11) unsigned DEFAULT NULL,
  `request` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `time` time NOT NULL,
  `year` year(4) NOT NULL,
  `month` tinyint(2) unsigned NOT NULL,
  `day` tinyint(2) unsigned NOT NULL,
  `bot` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
)
这种类型的日志记录实用吗?实际意义插入和选择可以在毫秒内执行。我意识到很多记录可以通过这种方式生成,但我不完全确定是否有更好的方式来完成我想做的一切

此外,选择今天的点击量并将其放在每页的底部是否可行?我对使用更大的数据库还比较陌生,我仍然在学习什么样的查询会很快,什么样的查询会很痛苦

我应该保留主键吗?我可以使用它返回并编辑任何我想一时兴起的行,我真的看不到自己做了一个重要的原因,但它会显着减慢我的插入?有什么好处吗?同样,出于同样的原因,我不应该再添加任何索引-对吗?是否包括帐户列的外键

我捕获当前日期和时间的替代方案是否可行?我首先用一个DATETIME列开始这个表,但从某个地方读到这样的表可能受益于对日期信息进行列划分;例如,如果我想计算今天的点击数,我可以将结果限制在

WHERE year="2012" AND month="02" AND day="16"
……与

WHERE date > "2012-02-15 23:59:59"

提前谢谢

到目前为止,您的日志表似乎是合理的。但我不使用时间、年、月、日列,而是使用时间戳,它只有四个字节。然后为该列添加索引

如果您使用范围搜索进行查询,您应该可以获得良好的响应时间

WHERE created >= "2011-01-01 00:00:00"
    AND created < "2012-01-01 00:00:00"

这种类型的日志记录很实用,但您可以从使用分区和子分区中获益:

因为您存储的是活动日志,所以随着时间的推移,您可能会有一个非常大的数据集。分区可能特别有用,因为您需要查看特定的月份和年份

例如,如果date列的数据类型为date或DATETIME,则可以执行以下操作:

PARTITION BY RANGE (MONTH(the_date))
(PARTITION p0 VALUES LESS THAN (0),
 PARTITION p1 VALUES LESS THAN (1),
 PARTITION p2 VALUES LESS THAN (2),
...[and so on up to 12]);
这将为每个月的数据提供分区。使用不同的分区进行测试后,请尝试使用explain partitions select*from运行查询。。。您将能够看到如何执行查询以及扫描哪些分区。最好的分区方法可能需要围绕最常见的查询进行定制。例如,您是否主要查看最近30天的数据?每月快照?自定义日期范围?这些都会对分区的结构产生影响

更进一步,您可以在每个分区中有子分区。为此,可以使用哈希分区:


您的主键问题也会受到分区的影响。表中的主键和任何唯一键都必须使用分区中使用的每一列。

您可能对您的问题感兴趣,因为您的问题似乎是开放式的/基于讨论的,可能适合另一个论坛。这些问题可能允许讨论,但我觉得我已经明确提出了一个具体的问题,回答问题:如果我建议的表是实用的,就像我定义的,能够在毫秒内进行查询。谢谢Luc!我知道有更好的方法来存储IP,但是我在上面找不到任何东西。当扫描表时,是否需要一些工作来验证每一行是否在该范围内?这是否比按年、月、日批量删除行要省力?如果您需要查询MONTHcreated=1之类的内容,那么您是对的。但在实践中,我认为你经常会在一个特定的范围内搜索,这个范围首先是受年份限制的,然后可能是受月份和日期限制的。如果该列有索引,则数据库将显示范围!这是有道理的。那么索引呢?该表将接收大量插入内容。索引是否会降低它们的速度并造成严重问题?因为时间戳是四个字节,主键是额外的四个字节,所以您应该计算每个数据记录总共额外的八个字节。我认为这与您建议的表结构的大小相比是一个很好的比率。使用答案中的示例代替YEARcreated=2011。
否则MySql在写分区时不会使用索引看起来非常有希望,为什么我以前从未听说过这个?谢谢你的意见!