nosql - 使用或不使用 NoSql 如何解决日志缓慢问题

标签 nosql logging sqlanywhere

我在日志搜索速度和磁盘大小方面遇到了问题。 它非常大,有大约 2.2 亿行和 25 GB 的磁盘大小,需要几分钟来获取一些选择。

它是如何工作的? 日志使用 Sql Anywhere 保存在数据库中,目前是版本 9,很快将迁移到 11(我们尝试迁移到 12,但由于某些驱动程序和一些问题,我们回到了 11)。

日志由两张表组成(名字改为英文,方便大家看得懂):

日志表

Id、DateTime、User、Url、Action 和 TableName。 操作是使用的操作:插入/删除/更新 TableName 是数据库中的哪个表受到影响。

日志表字段

Id、LogTable_Id、FieldName、NewValue、OldValue。 LogTable_Id 是 LogTable 的外键。 FieldName 是数据库中表的字段。

重要的是要注意 NewValue 和 OldValue 是 varchar 类型。因为它记录了来自其他表的各种字段(datetime、int 等)。

为什么会这样? 因为我们必须记录所有重要的事情。该系统是为交通机构部门制作的(我不知道它是否用正确的英语拼写,但现在你可以理解这是什么意思了),有时他们需要某种随机报告。

到目前为止,我们制作的报告只是简单地执行了一些 SQL 选择。但是,即使过滤了日期时间,也需要几分钟才能完成。当不经常请求时,不会发出提示。

但是他们要求越来越多的报告,有必要在软件中创建一个具有美观报告的功能。由于我们永远不知道他们的需求,我们必须返回记录并挖掘数据。

请求的某些信息仅在日志中。 (例如,什么用户不正确地向某人提供了车辆访问权)

到目前为止提出的一些想法:

Idea 1: I did some researches and I was told to work with NoSql using CouchDB. But the little i read i feel NoSql isn't a solution for my problem. I can't argue why for non experience in it.

Idea 2: Separate the Log Tables physically from the Database or from the machine.

Idea 3: Create a mirror from every table with a version field to keep history.

如果需要,我希望进行宏观优化或架构更改。

最佳答案

这似乎是一个非常标准的审计表。我不确定您是否需要为此使用 NoSQL 解决方案。大多数 RDBM 可以轻松处理 2.2 亿行。

看来最大的问题是表结构。通常,您将表展平以提高记录速度,并将其规范化以提高报告速度。如您所见,这些是相互矛盾的。

如果您使用的是 MS SQL 之类的东西,您可以构建一个平面表来记录性能,然后在其上构建一个简单的 Analysis Services 多维数据集。

另一种选择是仅针对报告进行优化,假设您可以保持足够的日志记录吞吐量。为此,您可能需要创建如下结构:

create table LogTable (
  LogTableID int identity(1,1),
  TableName varchar(100),
  Url varchar(200)
)

create table LogUser (
  LogUserID int indentity(1,1),
  UserName varchar(100)
)

create table LogField (
  LogFieldID int identity(1,1),
  FieldName varchar(100),
)

create table LogData (
  LogDataID bigint identity(1,1),
  LogDate datetime,
  LogTableID int references LogTable(LogTableID),
  LogFieldID int references LogField(LogFieldID),
  LogUserID int references LogUserID(LogUserID),
  Action char(1), -- U = update, I = insert, D = delete
  OldValue varchar(100),
  NewValue varchar(100)
)

这应该仍然足够快以快速记录数据,但为报告提供足够的性能。索引设计也很重要,一般按照基数递增的顺序进行,比如LogData(LogTableID, LingFieldID, LogDate)。您还可以喜欢分区以允许并行查询。

关于nosql - 使用或不使用 NoSql 如何解决日志缓慢问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8788818/

相关文章:

nosql - 更改后端时备份 Riak 数据

php - 基于URL查询的Elasticsearch JSON查询

c# - 在RavenDB中存储某些字段中具有空值的实体

r - 在 R 中维护输入/输出日志

kubernetes - Istio (1.6.4) 在 K8s 上进行日志聚合的最佳实践

passwords - 是否可以在不创建新数据库连接的情况下对 Sqlanywhere 系统用户进行身份验证?

node.js - Mongoose:创建 'virtual column' 的值

android Studio 日志不起作用

Sql COUNT 性能问题

c# - 更改c# WebReference url地址