我正在将"活动日志"添加到一个繁忙的网站,它应该向用户显示与他相关的最后 N 个操作,并允许转到专用页面查看所有操作、搜索它们等。
使用的数据库是MySQL,我想知道应该如何存储日志 - 我从一个用于全文搜索的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 )
);
根据您的架构,我猜(缓存除外(,您将每秒插入许多记录,并沿着select * from event where user_id = ? order by created_date desc
行运行相当不频繁的查询,可能使用分页策略(因此需要在查询结束时"限制 x"向用户显示其历史记录。
您可能还希望找到受特定类型事件影响的所有用户 - 尽管更有可能在离线过程中(例如,每晚向所有更新密码的用户发送邮件";这可能需要按照select user_id from event where message like 'password_updated'
行进行查询。
是否可能有很多情况下您想要搜索评论的正文文本?
您绝对应该阅读有关调整插入的MySQL手册; 如果你不需要搜索自由文本"评论",我会关闭索引;我还会考虑在"消息"表上使用常规索引。
引入"message_type"的概念也可能有意义,这样您就可以引入关系一致性(而不是依靠代码来正确拼写"password_updat3"(。例如,您可能有一个"event_type"表,其外键关系与事件表。
至于缓存 - 我猜用户只会不经常访问他们的历史记录页面。在他们访问站点时填充缓存,万一他们可能会访问他们的历史记录(如果我了解您的设计(会立即将解决方案的可扩展性限制为可以放入 cachce 的历史记录数量;由于历史记录表对于您的用户来说将快速增长,因此这可能很快成为一个重要因素。
对于像这样移动迅速且很少被访问的数据,缓存可能不是正确的解决方案。
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 ;
我的建议是使用无模式的存储系统..它们在大量日志记录数据中表现更好
尝试考虑
- 雷迪斯
- 蒙戈数据库
- 里亚克
或任何其他No SQL
系统