存储空间大小的计算

本页面介绍 Datastore 模式 Firestore 中的实体、键、属性和索引条目所占用的存储空间大小。您可以参阅 Datastore 模式价格,了解此类存储服务的费用。

字符串大小

字符串大小的计算方式为 UTF-8 编码字节数 + 1。

以下各项以字符串形式存储:

  • 种类名称
  • 命名空间名称(默认命名空间的大小为 0)
  • 属性名称
  • 字符串属性值

例如:

  • Task 这个种类名称使用了 4 个字节 + 1 个字节,总计 5 个字节。
  • description 这个属性名称使用了 11 个字节 + 1 个字节,总计 12 个字节。
  • my_name_space 这个命名空间名称使用了 13 个字节 + 1 个字节,总计 14 个字节。

键大小

键的大小是以下各项相加的总和:

  • 命名空间字符串的大小(如果不在默认命名空间中)
  • 完整的键路径字符串大小(每个整数 ID 为 8 个字节)
  • 16 个字节

对于默认命名空间中具有数字 ID 且无祖先实体的 Task 种类的键:

Task id:5730082031140864

键大小为 5 + 8 + 16 = 29 个字节:

  • Task 种类名称为 5 个字节
  • 数字 ID 为 8 个字节
  • 键为 16 个字节

对于默认命名空间中具有字符串 ID 且无祖先实体的 Task 种类的键:

Task name:my_task_id

键大小为 5 + 11 + 16 = 32 个字节:

  • Task 种类名称为 5 个字节
  • my_task_id 字符串 ID 为 11 个字节
  • 键为 16 个字节

对于默认命名空间中具有 TaskList 祖先实体的 Task 实体:

TaskList id:5654313976201216 > Task id:5629499534213120

祖先实体使用 9 + 8 = 17 个字节:

  • TaskList 种类名称为 9 个字节
  • 数字 ID 为 8 个字节

因此,具有 TaskList 祖先实体的 Task 实体的键大小使用 17 + 5 + 8 + 16 = 46 个字节:

  • 祖先实体为 17 个字节
  • Task 种类名称为 5 个字节
  • 数字 ID 为 8 个字节
  • 键为 16 个字节

如果此实体位于 my_name_space 命名空间中,则键大小为 14 + 46 = 60 个字节,因为 my_name_space 名称使用 14 个字节。

属性大小

属性的大小是以下各项相加的总和:

  • 属性名称字符串大小
  • 属性值的大小

下面按类型显示了各属性值的大小。

类型 大小
数组 数组中各个值的大小总和
Blob 字节长度
布尔值 1 个字节
双精度浮点数 8 个字节
嵌入式实体 实体大小
地理位置点 16 个字节
整数 8 个字节
键大小
Null 1 个字节
字符串 UTF-8 编码字节数 + 1
时间戳 8 个字节

例如,名为 done 的布尔型属性将使用 6 个字节:

  • done 属性名称为 5 个字节
  • 布尔值为 1 个字节

实体大小

实体的大小是以下各项相加的总和:

此示例针对默认命名空间中具有数字 ID 且无祖先实体的 Task 种类的实体:

Task id:5730082031140864
 - "type": "Personal"
 - "done": false
 - "priority": 1
 - "description": "Learn Google Cloud Datastore"

属性的总大小为 78 个字节:

属性名称和值 属性大小(以字节为单位)
"type": "Personal" 14
5(属性名称)+ 9(属性的字符串值)
"done": false 6
5(属性名称)+ 1(属性的布尔值)
"priority": 1 17
9(属性名称)+ 8(属性的整数值)
"description": "Learn Google Cloud Datastore" 41
12(属性名称)+ 29(属性的字符串值)

因此,实体大小为 29 + 78 + 32 = 139 个字节:

  • 键为 29 个字节
  • 属性为 78 个字节
  • 实体为 32 个字节

索引条目大小

对于内置索引和复合索引,索引条目大小的计算方式如下。

内置索引

内置索引条目的大小是以下各项相加的总和:

  • 已编入索引的实体的键大小
  • 已编入索引的属性名称的总和
  • 已编入索引的属性值的总和
  • 已编入索引的实体种类名称的大小
  • 32 个字节

以默认命名空间中具有数字 ID 且无祖先实体的 Task 种类的实体为例:

Task id:5730082031140864
 - "type": "Personal"
 - "done": false
 - "priority": 1
 - "description": "Learn Google Cloud Datastore"

如果 done 是已编入索引的属性,则单个属性 done 索引的内置索引条目由键、done 属性名称和值、Task 种类名称以及索引条目的 32 个字节组成。此索引条目的总大小为 72 个字节:

  • 键为 29 个字节
  • done 属性名称和布尔值为 6 个字节
  • Task 种类名称为 5 个字节
  • 索引条目为 32 个字节

默认情况下,Datastore 模式数据库会自动为每个实体种类的各属性预定义两个单属性索引:一个按升序排列,另一个按降序排列。因此,该实体在按升序排列的单属性 done 索引中有一个大小为 72 个字节的索引条目,并且在按降序排列的单属性 done 索引中也有一个大小为 72 个字节的索引条目。

复合索引

复合索引条目的大小是以下各项相加的总和:

以默认命名空间中具有数字 ID 且无祖先实体的 Task 种类的实体为例:

indexes:
- kind: Task
  properties:
  - name: done
    direction: asc
  - name: priority
    direction: asc

假设一个复合索引使用 donepriority 属性(均按升序排列):

此索引中索引条目的总大小为 70 个字节:

  • 键为 29 个字节
  • done 属性的布尔值为 1 个字节
  • priority 属性的整数值为 8 个字节
  • 索引条目为 32 个字节

如果您不希望 Datastore 模式 Firestore 保留某个属性的索引,请将该属性从索引中排除。请注意,排除属性会将其从所有复合索引中移除。

后续步骤