你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

如何为 NoSQL 全局辅助索引配置 Azure Cosmos DB(预览版)

适用范围: NoSQL

重要

Azure Cosmos DB for NoSQL 全局辅助索引目前为预览版。 此预览版在提供时未使用服务级别协议。 目前,不建议对生产工作负荷使用全局辅助索引。 此预览版的某些功能可能不受支持或者受限。 有关详细信息,请参阅 Microsoft Azure 预览版补充使用条款

全局辅助索引提供了一种强大的方法来优化查询性能,并通过使用不同的分区键和/或数据模型存储数据来简化应用程序逻辑。 本文介绍如何创建全局辅助索引,以及如何使用这些索引来避免跨分区查询。

先决条件

  • 现有的 Azure Cosmos DB 帐户。

启用全局辅助索引

为 Azure Cosmos DB 帐户启用全局辅助索引功能。 在启用全局辅助索引之前,必须为帐户启用连续备份

  1. 登录到 Azure 门户

  2. 转到你的 Azure Cosmos DB for NoSQL 帐户。

  3. 在资源菜单中,选择“设置”。

  4. 导航到“功能”页。 然后选择 NoSQL API 的全局辅助索引(预览版)启用

    如何在 Azure 门户中启用全局辅助索引功能的屏幕截图。

创建全局辅助索引

启用全局辅助索引功能后,可以创建全局辅助索引。

创建源容器

全局辅助索引存储源容器中的数据副本。 在创建全局辅助索引之前,请创建将从中生成索引容器的源容器。 如果 Azure Cosmos DB 帐户中已有要用作源的容器,则可以跳过这些步骤。

  1. 使用 Azure 门户、Azure SDK、Azure CLI 或 REST API 创建一个名为gsi-src的源容器,并将/customerId设为分区键路径。

    注释

    /customerId 字段在本文中仅用作举例。 对于你自己的容器,请选择适用于你的解决方案的分区键。

  2. 在源容器中插入几个项。 要遵循本文中的示例,请确保项具有 customerIdemailAddress 字段。 示例项的外观可能类似于以下内容:

    {
      "id": "eaf0338e-2b61-4163-822f-7bef75bf51de",
      "customerId": "36c7cc3d-1709-45c6-819f-10e5586a6cb7",
      "emailAddress": "justine@contoso.com",
      "name": "Justine"
    }
    

    小窍门

    在此示例中,在添加索引容器之前,使用示例数据填充源容器。 还可以从空源容器创建全局辅助索引。

创建全局辅助索引容器

创建源容器后,可以使用 Azure 门户或 Azure CLI 创建全局辅助索引容器。

  1. 导航到 Azure Cosmos DB 帐户中的“数据资源管理器”。 在此示例中, gsi-src 选择源容器,然后从下拉列表中选择 “新建全局辅助索引 ”。

    如何在 Azure 门户的数据资源管理器页中创建全局辅助索引的屏幕截图。

  2. 将为你填充源容器 ID。 在 “索引容器 ID ”字段中,输入 gsi-target

  3. “全局辅助索引定义 ”字段中,输入 SELECT c.customerId, c.emailAddress FROM c

  4. “分区”键 字段中,输入 /emailAddress

    如何在 Azure 门户的数据资源管理器页中配置全局辅助索引的屏幕截图。

  5. 全局辅助索引容器必须使用自动缩放吞吐量。 配置所需的任何其他容器设置,然后选择“ 确定 ”以创建全局辅助索引容器。

  6. 创建全局辅助索引容器后,数据会自动从源容器同步。 尝试在源容器中执行创建、更新和删除操作。 您会看到相同的更改被传播到全局辅助索引中的项目。

从全局辅助索引查询数据

在此示例中,源容器按customerId进行分区,且全局辅助索引容器按emailAddress进行分区。 如果没有索引容器,则仅包含emailAddress的查询会是跨分区查询,但现在可以针对全局辅助索引运行,从而提高效率。

从全局辅助索引查询数据类似于从任何其他容器查询数据。 可以使用 Azure 门户、Azure SDK 或 REST API 查询全局辅助索引中的数据。

Container container = client.GetDatabase("gsi-db").GetContainer("gsi-target");

FeedIterator<MyClass> myQuery = container.GetItemQueryIterator<MyClass>(new QueryDefinition("SELECT * FROM c WHERE c.emailAddress = 'justine@contoso.com'"));

后续步骤