我正在向繁忙的网站添加“活动日志”,该网站应向用户显示与他相关的最后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 )
);
答案 0 :(得分:2)
根据你的模式,我猜测(缓存除外),你将每秒插入许多记录,并沿select * from event where user_id = ? order by created_date desc
行运行相当不频繁的查询,可能采用分页策略(因此在查询结尾处要求“限制x”以向用户显示其历史记录。
您可能还希望查找受特定类型事件影响的所有用户 - 尽管更有可能在离线流程中(例如,每晚向所有已更新密码的用户发送邮件);这可能需要查询select user_id from event where message like 'password_updated'
的行。
是否可能有很多情况需要搜索评论的正文?
你一定要阅读MySQL Manual on tuning for inserts;如果你不需要搜索自由文本“评论”,我会把索引关掉;我还会考虑“消息”表上的常规索引。
引入“message_type”的概念也是有意义的,这样你就可以引入关系一致性(而不是依靠你的代码来正确拼写“password_updat3”)。例如,您可能有一个“event_type”表,与您的事件表具有外键关系。
至于缓存 - 我猜测用户只会偶尔访问他们的历史页面。当他们访问网站时填充缓存,他们可能会访问他们的历史记录(如果我了解您的设计)会立即将您的解决方案的可扩展性限制为您可以适应您的cachce的历史记录数量;由于历史表将为您的用户快速增长,这可能很快成为一个重要因素。
对于这样的数据,这种数据移动很快且很少访问,缓存可能不是正确的解决方案。
答案 1 :(得分: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 ;
答案 2 :(得分:-1)
我的建议是使用架构较少的存储系统..它们在高容量日志记录数据中表现更好
尝试考虑
或任何其他No SQL
系统