存储高容量日志记录数据的数据库架构是什么?

时间:2012-05-02 08:47:02

标签: php performance database-design logging

我正在向繁忙的网站添加“活动日志”,该网站应向用户显示与他相关的最后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 )
);

3 个答案:

答案 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)

我的建议是使用架构较少的存储系统..它们在高容量日志记录数据中表现更好

尝试考虑

  • Redis
  • MongoDB
  • Riak

或任何其他No SQL系统