索引键的热图模式

本页介绍了您可能会在 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 运算符添加更多字段。

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

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

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

热图上索引键条目示例

类型 说明 示例
集合范围单字段索引 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 索引。

array-contains 模式单字段索引的索引条目,系统会在向文档添加字段 Country: [USA, Japan] 时创建此类索引。请注意,系统还会默认为此字段创建 ASC、DESC 索引。该示例显示了 Country 字段的升序索引。
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 字段按升序排列,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

后续步骤