You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定义CosmosDB复合索引优化GROUP BY、聚合函数与过滤谓词

CosmosDB 复合索引优化方案

问题背景

你的查询需求是:在指定ProductType和Size范围内,按CategoryParentId、CategoryId分组,计算每组的最低Price和最高Discount。此前的索引未有效降低RU消耗,仅在GROUP BY中加入过滤字段后才实现优化,但会返回冗余数据。

正确的复合索引定义

你需要调整复合索引的字段顺序,让索引先覆盖WHERE中的等值过滤字段,再覆盖GROUP BY分组字段,最后是聚合函数用到的字段。具体索引配置如下:

[
    {
        "path": "/ProductType",
        "order": "ascending"
    },
    {
        "path": "/Size",
        "order": "ascending"
    },
    {
        "path": "/CategoryParentId",
        "order": "ascending"
    },
    {
        "path": "/CategoryId",
        "order": "ascending"
    },
    {
        "path": "/Price",
        "order": "ascending"
    },
    {
        "path": "/Discount",
        "order": "descending"
    }
]

索引顺序的核心逻辑

CosmosDB的复合索引遵循前缀匹配规则,查询引擎会按索引顺序依次匹配执行:

  1. 优先用ProductType和Size的等值条件快速筛选目标数据集,避免全集合扫描;
  2. 接着利用索引的有序性,直接按CategoryParentId、CategoryId完成分组,无需额外排序操作;
  3. 最后从索引中直接提取Price(求MIN)和Discount(求MAX)的极值,无需加载完整文档数据。

之前的索引虽包含所有字段,但未将过滤条件字段放在最前,导致查询引擎无法优先利用索引完成数据筛选,后续分组和聚合仍需处理大量数据,因此RU消耗未下降。

效果验证

使用上述索引后,原查询(无需在GROUP BY中加入ProductType和Size)将直接通过索引完成筛选、分组与聚合操作,RU消耗会降至与添加冗余分组字段时相近的水平,同时返回无冗余的结果集。

内容的提问来源于stack exchange,提问作者Phil Harvey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 09:26:23