索引键的热图模式

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

均匀分布使用量

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

如果热图显示深色与亮色交织的粒状混合,则表示索引键的写入/删除操作均匀分布在整个数据库中。此热图可能表示 Firestore 的有效使用模式。

顺序键的索引

具有一条亮对角线的热图可以指示索引位于严格递增或递减的键(例如时间戳)上。不建议对顺序键建立索引,因为这可能会创建热点。出现热点问题时,您可能会观察到相应的延迟时间增加。

以下是一些常见的指数热点:

因时间戳递增而导致的热点

热图:显示因时间戳增加而导致的热点

在此示例中,具有一条亮对角线的热图可以指示使用时间戳字段名称上严格递增或递减的索引写入/删除操作的数据库。

因字段名称数量增加而导致的热点

热图:显示因磁场增加而导致的热点

在此示例中,具有一条亮对角线的热图可以指示使用严格递增或递减的索引写入/删除操作的数据库,这些操作针对的是增量字段,例如自动生成的账单编号。

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

了解索引键结构

在了解 Key Visualizer 工具中显示的索引键的结构之前,请先了解 Firestore 中的索引

以下代码显示了一个示例索引键格式,当您将鼠标悬停在热图上受影响的键范围上时,系统会显示此格式。

COLLECTION: projects/PROJECT_ID/databases/(default)/documents/Users
  PROPERTIES: (Timestamp: DESC) 
  VALUES: (16500000000000001)
  DOCUMENT: projects/PROJECT_ID/databases/(default)/documents/Users/5000000000000001

其中:

  • COLLECTION:数据库中集合的位置。根据范围,它可以是集合范围的集合路径,也可以是集合组范围的集合名称。
  • 属性:用于创建索引的字段。__name__ 排序属性仅针对修改默认排序的索引定义显示。
  • VALUES:每个属性的值。
  • DOCUMENT:相应操作中更新的文档的 ID。

在前面的示例中,从 PROPERTIES 值中确定字段,以找到受影响的索引。

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

  1. 在 Google Cloud 控制台中,前往数据库页面。

    前往“数据库”

  2. 从数据库列表中选择所需的数据库。

  3. 在导航菜单中,点击索引

  4. 前往复合单字段标签页。

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

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

    对于复合索引,请使用 OR 运算符添加更多字段。

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

  • 复合索引:修改索引,确保不选择值单调递增或递减的字段作为索引的第一个字段,或者删除索引。

  • 单字段索引:为要排除的字段和排序顺序添加例外项。如需了解详情,请参阅添加单字段豁免

热图上的索引键条目示例

类型 说明 示例
集合范围的单字段索引(升序、降序) 默认情况下,Firestore 使用集合范围创建索引。

针对 Users/5000000000000001 文档的 Timestamp 字段的单字段索引的索引条目,按降序排列。
COLLECTION: projects/PROJECT_ID/databases/(default)/documents/Users
PROPERTIES: (Timestamp: DESC)
VALUES: (16500000000000001)
DOCUMENT: projects/PROJECT_ID/databases/(default)/documents/Users/5000000000000001
数组字段的集合范围单字段索引 对于文档中的每个数组字段,Firestore 会创建并维护一个集合范围内的 array-contains 索引。

当向文档添加字段 Country: [USA, Japan] 时,将创建 array-contains 模式单字段索引的索引条目。请注意,系统还会默认为此字段创建 ASC 和 DESC 索引。此示例显示了 Country 字段的 ASC 索引。
COLLECTION: projects/PROJECT_ID/databases/(default)/documents/Users
PROPERTIES:(Country: ASC)
VALUES:([USA, Japan]) DOCUMENT:(projects/PROJECT_ID/databases/(default)/documents/Users/5000000000000001)
集合组单字段索引 ASC、DESC、ARRAY 集合组包含具有相同集合 ID 的所有集合。
集合组单字段索引(针对 Timestamp 字段,按降序排列)的索引条目。
COLLECTION GROUP: Users
PROPERTIES: (Timestamp: DESC)
VALUES: (16500000000000001L)
DOCUMENT: projects/PROJECT_ID/databases/(default)/documents/Users/5000000000000001
集合组单字段索引 ASC、DESC、ARRAY 集合组单字段索引(针对 Country 字段,采用 array-contains 模式)的索引条目 COLLECTION GROUP: Users PROPERTIES: (Country: ARRAY ASC) VALUES: (USA) DOCUMENT: projects/PROJECT_ID/databases/(default)/documents/Users/5000000000000001
具有 ASC、ASC、ARRAY 属性的集合复合索引条目 当使用集合范围索引定义创建嵌套文档时,系统会创建具有父级的复合索引条目。

复合索引的索引条目,其中 TimestampName 字段按升序排列,Country 字段处于 array-contains 模式。
COLLECTION: projects/PROJECT_ID/databases/(default)/documents/Users
PROPERTIES: (Timestamp: ASC, Name: ASC,Country: ARRAY)
VALUES: (16500000000000001L, 'Alice', 'USA')
DOCUMENT: (projects/PROJECT_ID/databases/(default)/documents/Users/5000000000000001)
具有 ASC、ASC 属性的集合组范围复合索引条目 针对 Timestamp 字段(按升序排列)和 Name 字段(按升序排列)的复合索引的索引条目 COLLECTION GROUP: Users
PROPERTIES: (Timestamp: ASC, Name: ASC)
VALUES: (16500000000000001L, 'Alice')
DOCUMENT: (projects/PROJECT_ID/databases/(default)/documents/Users/5000000000000001)
具有 ASC 和 __name__ 属性的集合范围复合索引条目 针对 Users/5000000000000001 文档的复合索引的索引条目,其中 Timestamp 字段按升序排列,__name__ 排序按降序排列。您可以在索引定义中使用 __name__ 作为最后一个字段来更改结果的默认排序 COLLECTION: projects/PROJECT_ID/databases/(default)/documents/Users
PROPERTIES: (Timestamp: ASC, __name__ DESC)
VALUES: (16500000000000001)
DOCUMENT: projects/PROJECT_ID/databases/(default)/documents/Users/5000000000000001

后续步骤