什么是存储大量日志记录数据的好数据库架构


What's a good DB schema to store high volume logging data?

我正在将"活动日志"添加到一个繁忙的网站,它应该向用户显示与他相关的最后 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系统