索引键的热图模式

本页介绍了您可能会在 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:集合在数据库中的位置。根据范围,它可以是集合范围的集合路径,也可以是集合组范围的集合名称。
  • PROPERTIES:用于创建索引的字段。系统仅针对修改默认排序的索引定义显示 __name__ 排序属性
  • VALUES:每个属性的值。
  • DOCUMENT:在操作中更新的文档的 ID。

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

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

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

    前往“数据库”

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

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

  4. 转到复合单字段标签页。

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

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

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

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

  • 复合索引:修改索引以确保其值单调递增或递减的字段未选为要编入索引的第一个字段,或者删除该索引。

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

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

类型 说明 示例
集合范围单字段索引 ASC、DESC 默认情况下,Firestore 使用集合范围创建索引。

Timestamp 字段上的单字段索引条目(按 Users/5000000000000001 文档降序排列)。
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 集合组单字段索引(array-contains 模式下 Country 字段中的索引条目) COLLECTION GROUP: Users PROPERTIES: (Country: ARRAY ASC) VALUES: (USA) DOCUMENT: projects/PROJECT_ID/databases/(default)/documents/Users/5000000000000001
具有 ASC、ASC、ARRAY 属性的集合复合索引条目 使用集合范围索引定义创建嵌套文档时,系统会创建具有父级的复合索引条目。

包含 TimestampName 字段的复合索引索引条目(按升序排列,Countryarray-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__ 属性的集合范围复合索引条目 Timestamp 字段上的复合索引条目(按升序排序)、__name__(按降序排序)Users/5000000000000001 文档的索引条目。您可以使用 __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

后续步骤