配置数据存储区索引

App Engine 使用 Datastore 中的索引来处理应用进行的每个查询。每当实体发生变化时都会更新这些索引,因此当应用进行查询时可快速返回结果。为此,Datastore 需要预先了解应用将执行哪些查询。您可以在配置文件中指定应用所需的索引。在您测试应用时,本地开发服务器可以自动生成索引配置文件。

本指南说明如何创建和管理索引。 如需详细了解背景信息,请参阅 Datastore 索引

创建 Datastore 索引

应用执行的每个 Datastore 查询都需要相应的索引。简单查询(例如对单个属性的查询)的索引是自动创建的。复杂查询的索引必须在名为 index.yaml 的配置文件中进行定义。此文件随应用一起部署,用于在 Datastore 中创建索引。

下面是一个 index.yaml 文件示例:

indexes:

- kind: Cat
  ancestor: no
  properties:
  - name: name
  - name: age
    direction: desc

- kind: Cat
  properties:
  - name: name
    direction: asc
  - name: whiskers
    direction: desc

- kind: Store
  ancestor: yes
  properties:
  - name: business
    direction: asc
  - name: owner
    direction: asc

使用开发服务器创建索引

当应用尝试执行需要索引的查询但该索引在配置文件中没有适当的条目时,开发网络服务器 (dev_appserver.py) 会自动向此文件添加条目。

在开发服务器中,如果您执行应用将进行的每个查询,开发服务器将为 index.yaml 文件中的条目生成完整的列表。

开发网络服务器将生成的索引定义添加到 index.yaml 时,它会在下面这行的下方操作,并在必要时插入此行:

# AUTOGENERATED

开发网络服务器将该行下面的所有索引定义都视为自动控制,并且可能会在应用执行查询时更新该行下方的现有定义。

手动创建索引

您既可以将索引手动添加到 index.yaml 文件,也可以修改现有条目。对于手动控制的查询,您必须将索引添加到注有 AUTOGENERATED 的行上方。

该行上方的所有索引定义都被视为手动控制,开发网络服务器不会对其进行更新。开发服务器仅在该行下方进行更改,并且仅在完整的 index.yaml 文件未描述索引(该索引说明应用执行的查询)时才进行此操作。要控制自动索引定义,请将其移到该行上方。

如需了解语法信息,请参阅 index.yaml 参考

更新索引

使用 gcloud 命令将 index.yaml 配置文件上传到 Datastore。如果 index.yaml 文件定义了 Datastore 中不存在的任何索引,则会构建这些新索引。

Datastore 可能需要一段时间才能创建所有索引,因此这些索引不会立即供 App Engine 使用。如果您的应用已配置为接收流量,而查询需要的索引仍在构建过程中,则查询时可能会发生异常。

为避免异常,您必须留出时间来构建所有索引。如需详细了解如何创建索引及查看示例,请参阅部署 Python 2 应用

要将索引配置上传到 Datastore,请从 index.yaml 所在的目录运行以下命令:

gcloud datastore indexes create index.yaml

如需了解详情,请参阅 gcloud datastore 参考文档

您可以使用 Cloud Console 检查索引的状态

删除未使用的索引

更改或移除 index.yaml 中的索引时,原始索引不会自动从 Datastore 中删除。这样,您便能够在构建新索引期间让应用的旧版本继续运行,或者在发现新版本存在问题时立即还原到旧版本。

如果确定不再需要 Datastore 中剩余的旧索引,可以运行以下命令来删除未在 index.yaml 文件中定义的任何索引:

gcloud datastore indexes cleanup index.yaml

如需了解详情,请参阅 gcloud datastore 参考文档