【问题标题】:Database indices for log table日志表的数据库索引
【发布时间】:2017-09-22 13:44:29
【问题描述】:

我需要在数据库中创建日志表。每个日志都有不同的参数。这是我想出的桌子设计。

 Table Log
============
ID(INT)
Action(INT)
Created(TIMESTAMP)

 Table Parameter
================
ID(INT)
ActionID(INT)
Title(VARCHAR(50))
VALUE(VARCHAR(300))

我的问题是,我需要对这个日志表执行复杂的查询,例如

  • 谁做了什么动作,什么时候做的?

    如果title = "personID",这意味着我需要检查参数,以及我需要检查动作代码是什么意思。

  • 销售操作的总价格

    对于这个,我需要检查“销售”的操作代码(比如 3(作为整数)),然后我需要用标题检索该操作的参数“价格”,然后将它们加倍并求和。

此查询将扩展,我需要确保我的设计可以回答更复杂的查询。我知道索引会带来很大的提升,但我不太确定需要在哪里添加才能充分利用数据库引擎。底层数据库是 MySQL。

哪些字段应该有索引?或者我的设计是否符合我的目的?我也在使用 InnoDB 引擎。

编辑

示例 SQL

SELECT LOG.ID, LOG.ACTION, LOG.CREATED FROM LOG, PARAMETER
    WHERE PARAMETER.ACTIONID = ACTION.ID AND 
          PARAMETER.TITLE = "PERSONNAME" AND 
          PARAMETER.VALUE = 'JOHN' AND 
          PARAMETER.TITLE = "PRICE" AND 
          (CAST(PARAMETER.VALUE AS DOUBLE) > 30.0) AND 
          PARAMETER.TITLE = "DATE" AND 
          (CAST(PARAMETER.VALUE AS TIMESTAMP) > (NOW() - INTERVAL 1 DAY)))

我们拥有的条件越多,SQL 中使用的Parameter.TITLEParameter.VALUE 对就越多。

【问题讨论】:

  • 在看到 SELECT 之前无法确定索引。
  • @RickJames 我已经用一个可能的查询编辑了这个问题。

标签: mysql database logging indexing entity-attribute-value


【解决方案1】:

您需要多次 JOINPARAMETER,每个要测试的键值对一次。有很多例子;按照我添加的 Entity-Attribute-Value 标签。

由于这是一个 EAV 问题,您将遇到性能问题。

在我倡导的 WP here 的更改中可以找到一个改进

另一个讨论是here,关于为什么不在 K-V 表中隐藏您想要过滤的内容。还有一种选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    相关资源
    最近更新 更多