Azure表存储 - 用于快速查询的分区密钥设计

时间:2017-07-31 12:32:37

标签: azure azure-table-storage

我们将日志条目存储到Azure表存储中。我们正在存储以下属性:

  • 日期(日期时间)
  • tenantId(长)
  • 用户名(字符串)
  • severity(int - 错误(0),警告(1),信息(2),调试(3)的枚举)
  • ......其他现在不重要的属性

有大量的日志条目,我们希望根据以下列快速查询日志:

  • 日期(自/至)
  • tenantId(等于)
  • 严重性(从/到)
  • 用户名(等于)

因此我们将rowKey设计为date + guid以保证唯一性。现在我们需要设计PartitionKey。我们需要能够根据tenantId,用户名和严重性进行查询。所以我们需要让他们去PartitionKey。

以下格式:{severity} - {tenantId} - {username}似乎是候选人(密钥的示例是1-500-me@me.com,这意味着严重性:警告,tenantId:500,用户:我@ me.com)。例如,我想查询:

  • 调试和信息严重性

这很好,因为我可以写PartitionKey >= 2 AND PartitionKey < 4, - 它会减少其他严重性的所有结果。

但是如果我需要为tenantId = 500增强此查询(仅适用于tenantId 500的Debug和Info),我需要编写PartitionKey >= 2-500 AND PartitionKey < 2-501 AND PartitionKey >= 3-500 AND PartitionKey < 3-501

所以看起来可能,但查询变得更复杂。我知道我只能测试它的性能,但问题是是否有更好的RowKey和PartitionKey设计来实现更好的性能。

1 个答案:

答案 0 :(得分:4)

推荐的方法是使用不同的PartitionKeys为相同的数据添加多行。例如,如果您有以下数据:

  

日期:2017-07-31

     

tenantId:3

     

严重程度:2

     

用户名:me@me.com

以下是您的数据应存储在表格中的方式:

PartitionKey    RowKey  date        tenantId    severity    user
----------------------------------------------------------------------
D|2017-07-31    GUID()  2017-07-31  500         2           me@me.com
T|500           GUID()  2017-07-31  500         2           me@me.com
S|2             GUID()  2017-07-31  500         2           me@me.com
U|me@me.com     GUID()  2017-07-31  500         2           me@me.com

因此,当您需要查询租户ID和严重性时,您会执行以下操作:

PartitionKey eq 'T|500' and severity eq 2

PartitionKey eq 'S|2' and tenant eq 500