索引键的热图模式

本页介绍了您可能会在 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:实体的命名空间
  • KIND:实体的种类,用于对实体进行分类。
  • 属性:与实体相关的属性__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'),UserList,1,User,5000000000000001
VALUES: (16500000000000001, 'Alice')
ENTITY: KEY(PROJECT('PROJECT_ID'),NAMESPACE('NS'),UserList,1,User,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'),UserList,1,User,5000000000000001)

后续步骤