索引键的热图模式

本页介绍了您可能会在 Key Visualizer 热图中看到的模式示例。这些模式可帮助您排查特定的性能问题。

均匀分布使用量

显示均匀分布读写操作的热图

如果热图显示深色和亮色的精细组合,则索引键的写入/删除操作会均匀分布在整个数据库中。此热图可能表示 Datastore 模式的有效使用模式。

依序键上的索引

具有一条亮对角线的热图可能表示键上的索引(例如时间戳)严格递增或递减。不建议为顺序键创建索引,因为这可能会产生热点问题。进行热点处理时,您可能会发现延迟时间相应延长。

下面列举了一些关于索引的常见热点示例:

由于时间戳不断增加导致的热点问题

热图因时间戳增加而显示热点

在此示例中,具有一条亮对角线的热图可能表示数据库对时间戳属性使用严格递增或递减索引写入/删除操作。

因属性名称增加而产生的热点问题

热图显示由于属性增加而出现热点问题

在此示例中,具有一条亮对角线的热图可能表示数据库对增量属性(例如自动生成的账单编号)使用严格递增或递减索引写入/删除操作。

如需确定热点问题,请使用 Key Visualizer 工具并了解索引键结构,以确定哪个索引导致问题,并按照最佳实践豁免这些索引。

了解索引键结构

在您了解 Key Visualizer 工具中看到的索引键的结构之前,请先了解 Datastore 模式下的索引

以下代码展示了一个示例索引键格式,您将鼠标悬停在热图上受影响的键范围上时,就会看到该格式。

NAMESPACE: NS KIND: Users
PROPERTIES: (Timestamp: DESC, Name: DESC)
ANCESTOR: KEY(PROJECT('PROJECT_ID'),NAMESPACE('NS'),`UserList`,1)
VALUES: (16500000000000001,'Alice')
ENTITY:KEY(PROJECT('PROJECT_ID'),NAMESPACE(''),`UserList`,1,`User`,5000000000000001)

其中:

  • NAMESPACE:实体的命名空间
  • 种类:对实体进行分类的实体的种类
  • 属性:与实体相关的属性。系统仅针对修改默认排序的索引定义显示 __key__ 排序属性。
  • ANCESTOR:可选的祖先实体路径,用于在数据库层次结构中查找实体。
  • VALUES:每个属性的值。
  • ENTITY:在操作中更新的实体的 ID。

在前面的示例中,识别 PROPERTIES 值中的属性来查找受影响的索引。

如需查找索引,请完成以下步骤:

  1. 转到 Google Cloud 控制台中的 Datastore 模式索引页面。

    转到 Datastore 模式“索引”

    您可以通过分析 PROPERTIES 字段来确定索引的类型。如需了解详情,请参阅索引键示例

  2. 点击过滤条件,选择字段,然后输入字段的名称。

    如果是复合索引,请使用 OR 运算符添加更多属性。

确定导致问题的索引后,您可以使用以下解决方案:

  • 内置索引:排除属性,使索引不保留该属性的索引条目。如需了解详情,请参阅排除的属性
  • 复合索引:修改 index.yaml 文件中的索引以确保值单调递增或递减的字段未选为要编入索引的第一个字段,或者删除该索引。如需了解详情,请参阅关于 index.yaml

热图上的索引关键条目示例

类型 说明 示例
内置索引条目 Timestamp 属性上的单个属性索引的索引条目(按 NS 命名空间降序排列)。 NAMESPACE: NS
KIND: Users
PROPERTIES: (Timestamp: DESC)
ANCESTOR: NONE
VALUES: (16500000000000001)
ENTITY: KEY(PROJECT('PROJECT_ID'), NAMESPACE('NS'),用户, 5000000000000001)
内置索引条目 默认命名空间中单个属性索引的索引条目。 NAMESPACE: ' '
KIND: Users
PROPERTIES: (Timestamp: DESC)
ANCESTOR: NONE
VALUES: (16500000000000001)
ENTITY: KEY(PROJECT('PROJECT_ID'), NAMESPACE('NS'),用户, 5000000000000001)
复合索引条目 在未启用祖先实体的情况下按降序排列 Timestamp 属性和 Name 属性上的复合索引的索引条目。 NAMESPACE: NS
KIND: Users
PROPERTIES: (Timestamp: DESC, Name: DESC)
ANCESTOR: NONE
VALUES: (16500000000000001, 'Alice')
ENTITY: KEY(PROJECT('PROJECT_ID'),NAMESPACE('NS'),用户,5000000000000001)
具有祖先实体的复合索引条目 Timestamp 属性上的复合索引(按降序排序)和 Name 属性(按降序排序)的索引条目(已启用祖先实体)。 NAMESPACE: NS
KIND: Users
PROPERTIES: (Timestamp: DESC, Name: ASC)
ANCESTOR: KEY(PROJECT('PROJECT_ID'),NAMESPACE('NS'),用户列表,1,用户,5000000000000001
VALUES: (16500000000000001, 'Alice')
ENTITY: KEY(PROJECT('PROJECT_ID'),NAMESPACE('NS'),用户列表,1,用户,5000000000000001)
包含 __key__ 的复合索引条目 Timestamp 属性上的复合索引(升序)和 __key__(降序)的索引条目,且未启用祖先实体。您可以使用 __key__ 作为索引定义中的最后一个属性来更改结果的默认排序方式。 NAMESPACE: NS
KIND: Users
PROPERTIES: (Timestamp: ASC, __key__ DESC)
ANCESTOR: NONE
VALUES: (16500000000000001)
ENTITY: KEY(PROJECT('PROJECT_ID'),NAMESPACE('NS'),用户列表,1,用户,5000000000000001)

后续步骤