1

我正在向一个繁忙的网站添加“活动日志”,它应该向用户显示与他相关的最后 N 个操作,并允许转到专用页面以查看所有操作、搜索它们等。

使用的数据库是 MySQL,我想知道应该如何存储日志 - 我从用于 FULLTEXT 搜索的单个 Myisam 表开始,并避免对每个操作进行额外的选择查询:1)对该表的插入发生 2 ) 更新每个 APC 缓存,因此在下一页请求 mysql 上不使用。缓存有一个日志生命周期,如果它丢失,来自用户的第一个 AJAX 请求会创建它。

我为每个用户缓存 3 个最后的事件,所以当一个新事件发生时,我会抓取当前缓存,将新事件添加到开头并删除最旧的事件,所以缓存中总是有 3 个。该网站的每个页面都有一个显示这些内容的小框。

这是正确的设置吗?你会如何推荐实现这种功能?

我的架构是:

CREATE DATABASE `audit`;

CREATE TABLE `event` (
`eventid` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`userid` INT UNSIGNED NOT NULL ,
`createdat` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
`message` VARCHAR( 255 ) NOT NULL ,
`comment` TEXT NOT NULL
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_unicode_ci;

ALTER DATABASE `audit` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

ALTER TABLE `audit`.`event` ADD FULLTEXT `search` (
    `message` ( 255 ) ,
    `comment` ( 255 )
);
4

3 回答 3

2

根据您的架构,我猜测(缓存除外),您将每秒插入许多记录,并且select * from event where user_id = ? order by created_date desc可能使用分页策略(因此需要“limit x”)查询以向用户显示他们的历史记录。

您可能还希望找到受特定类型事件影响的所有用户——尽管更有可能在离线过程中(例如,每晚向所有已更新密码的用户发送邮件);这可能需要按照select user_id from event where message like 'password_updated'.

是否有很多情况下您想搜索评论的正文?

您绝对应该阅读MySQL Manual on Tuning for inserts;如果您不需要搜索自由文本“评论”,我会关闭索引;我还会考虑“消息”表上的常规索引。

引入“message_type”的概念也可能是有意义的,这样您就可以引入关系一致性(而不是依靠您的代码来正确拼写“password_updat3”)。例如,您可能有一个“event_type”表,与您的事件表有外键关系。

至于缓存——我猜用户只会很少访问他们的历史页面。当他们访问站点时填充缓存,如果他们可能会访问他们的历史记录(如果我理解您的设计)会立即限制您的解决方案的可扩展性,即您可以将多少历史记录放入您的缓存中;由于您的用户的历史记录表将非常迅速地增长,这可能很快成为一个重要因素。

对于像这样快速移动且很少访问的数据,缓存可能不是正确的解决方案。

于 2012-05-02T09:25:31.723 回答
1

这就是 Prestashop 的做法: CREATE TABLE IF NOT EXISTS `ps_log` ( `id_log` int(10) unsigned NOT NULL AUTO_INCREMENT, `severity` tinyint(1) NOT NULL, `error_code` int(11) DEFAULT NULL, `message` text NOT NULL, `object_type` varchar(32) DEFAULT NULL, `object_id` int(10) unsigned DEFAULT NULL, `id_employee` int(10) unsigned DEFAULT NULL, `date_add` datetime NOT NULL, `date_upd` datetime NOT NULL, PRIMARY KEY (`id_log`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;

于 2015-07-31T08:33:23.597 回答
-1

我的建议是使用无模式存储系统.. 它们在大容量日志数据中表现更好

尝试考虑

  • 雷迪斯
  • MongoDB
  • 里亚克

或任何其他No SQL系统

于 2012-05-02T08:56:16.393 回答