🔥关注墨瑾轩,带你探索编程的奥秘!🚀
🔥超萌技术攻略,轻松晋级编程高手🚀
🔥技术宝库已备好,就等你来挖掘🚀
🔥订阅墨瑾轩,智趣学习不孤单🚀
🔥即刻启航,编程之旅更有趣🚀

在这里插入图片描述在这里插入图片描述

在 Azure Cosmos DB 中,索引优化是提升查询性能和降低 RU 成本的关键。以下是结合知识库内容和实际场景的索引优化策略:


1. 索引策略配置

Azure Cosmos DB 默认对所有属性进行索引(indexingMode: "Consistent"),但可以通过自定义索引策略优化性能。

1.1 包含/排除路径
  • 包含根路径:必须显式包含根路径 /*,并选择性排除不需要索引的路径。
    {
      "indexingMode": "Consistent",
      "includedPaths": [
        { "path": "/*" }  // 包含所有属性
      ],
      "excludedPaths": [
        { "path": "/nonIndexedField/?" },  // 排除特定字段
        { "path": "/largeArray/[]/*" }     // 排除大数组
      ]
    }
    
  • 按需包含:仅对频繁查询的字段创建索引,减少写入开销。
    {
      "includedPaths": [
        { "path": "/id/?" },
        { "path": "/status/?" },
        { "path": "/location/[]/city/?" }
      ]
    }
    
1.2 系统属性默认索引
  • id_ts(系统时间戳)始终被索引,无法禁用。利用这些默认索引优化查询:
    SELECT * FROM c WHERE c.id = "document1"
    

2. 复合索引(Composite Indexes)

  • 多条件查询优化:对 ORDER BY 或多个 WHERE 条件的组合查询,创建复合索引。
    {
      "compositeIndexes": [
        [
          { "path": "/status", "order": "ascending" },
          { "path": "/priority", "order": "descending" }
        ]
      ]
    }
    
  • 查询示例
    SELECT * FROM c WHERE c.status = 'active' AND c.priority > 5 ORDER BY c.status DESC
    

3. 矢量索引优化(DiskANN/QuantizedFlat)

  • 适用场景:语义搜索、推荐系统等向量相似度查询。
  • 分片 DiskANN:通过 vectorIndexShardKey 分片高基数数据,提升大规模向量搜索性能。
    "vectorIndexes": [
      {
        "path": "/embedding",
        "type": "DiskANN",
        "vectorIndexShardKey": ["/tenantID"]  // 按租户分片
      }
    ]
    
  • 参数调优
    • quantizationByteSize:增加值可提高精度,但会增加 RU 成本。
    • indexingSearchListSize:增大值可提升召回率,但会增加索引构建时间。

4. 数组字段优化

  • 避免 ARRAY_CONTAINS 性能问题
    • 方案 1:提取数组元素为单独属性
      {
        "tags": ["cloud", "database"],
        "tag_cloud": true,
        "tag_database": true
      }
      
      查询优化:
      SELECT * FROM c WHERE c.tag_cloud = true
      
    • 方案 2:创建多键索引
      {
        "includedPaths": [
          { "path": "/tags/[]/?", "indexes": [ { "kind": "Hash", "dataType": "String" } ] }
        ]
      }
      

5. 自动缩放与资源分配

  • 动态调整吞吐量:根据查询负载自动扩展 RU/s,避免资源浪费。
    # 使用 Python SDK 更新吞吐量
    container.update_throughput(
        throughput=10000,  # 设置更高 RU/s
        autoscale_settings={"maxThroughput": 20000}
    )
    

6. 监控与调优

  • 性能指标分析

    • 使用 Azure 门户或 SDK 收集 RU 消耗、查询延迟等指标。
    • 示例代码
      from azure.cosmos import CosmosClient
      
      client = CosmosClient("your-endpoint", "your-key")
      database = client.get_database_client("your-database")
      container = database.get_container_client("your-container")
      
      metrics = container.read_metrics()  # 获取性能指标
      for metric in metrics:
          print(metric)
      
  • 查询计划分析

    • 使用 EXPLAINQuery Metrics 工具检查是否命中索引。
    • 示例
      EXPLAIN SELECT * FROM c WHERE c.status = 'active'
      

7. 实际场景优化示例

场景:电商订单查询
  • 需求:按用户 ID 和订单状态查询订单。
  • 优化步骤
    1. 创建复合索引:
      {
        "compositeIndexes": [
          [
            { "path": "/userId", "order": "ascending" },
            { "path": "/status", "order": "ascending" }
          ]
        ]
      }
      
    2. 排除非必要字段(如 orderDetails):
      "excludedPaths": [
        { "path": "/orderDetails/[]/*" }
      ]
      

8. 注意事项

  • 避免冗余索引:定期审查未使用的索引,删除冗余路径。
  • 分页查询优化:使用 continuationToken 避免固定页面大小。
    SELECT * FROM c WHERE c.status = 'active' OPTIONALS CONTINUATIONTOKEN 'token'
    
  • 分区键设计:合理选择分区键(如 /tenantID),避免热分区问题。

总结

通过 索引策略精简复合索引设计矢量索引调优监控反馈,可以显著提升 Cosmos DB 查询性能并降低 RU 成本。结合业务场景灵活调整索引策略,是优化数据库性能的核心。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐