在 Couchbase 中 INCLUDE MISSING 选项会直接影响索引的行为和覆盖范围

在 Couchbase 中,INCLUDE MISSING 选项会直接影响索引的行为和覆盖范围,进而决定查询优化器的选择。以下是两个索引的区别及查询命中原因:


1. 两个索引的区别

索引 1:idx_pi_content_storeId
CREATE INDEX idx_pi_content_storeId 
ON `default`:`origin`.`pi`.`pi_content`(`storeId`);
  • 行为
    • 这是一个标准的 二级索引,仅索引 storeId 字段存在的文档(即 storeId 不为 NULL 或未缺失的文档)。
    • 如果文档的 storeId 字段不存在(缺失)或值为 NULL,则该文档 不会被索引
索引 2:adv_storeId(含 INCLUDE MISSING
CREATE INDEX adv_storeId 
ON `default`:`origin`.`pi`.`pi_content`(`storeId` INCLUDE MISSING);
  • 行为
    • 通过 INCLUDE MISSING 选项,索引会包含所有文档,无论 storeId 是否存在或为 NULL
    • 对于 storeId 缺失的文档,索引会将其视为一个特殊值(类似 MISSING)并存储。

2. 为什么 SELECT storeId 只能命中 adv_storeId

当执行以下查询时:

SELECT storeId FROM `default`:`origin`.`pi`.`pi_content`;
关键原因
  1. 覆盖索引(Covering Index)

    • 如果索引本身包含查询所需的所有字段(这里是 storeId),优化器会优先选择该索引,避免回表(Fetch)操作,直接通过索引返回结果。
    • adv_storeId 索引由于包含 INCLUDE MISSING,会覆盖所有文档(包括 storeId 缺失的文档),因此可以直接通过索引返回完整的 storeId 值列表。
    • idx_pi_content_storeId 仅包含 storeId 存在的文档,若查询需要返回所有文档(包括 storeId 缺失的),优化器无法使用此索引,因为它无法覆盖缺失值的文档。
  2. 数据完整性

    • 如果表中存在 storeId 字段缺失的文档,只有 adv_storeId 能确保查询结果的完整性。若使用 idx_pi_content_storeId,缺失 storeId 的文档会被排除在结果外,导致结果不准确。
  3. 优化器决策

    • Couchbase 优化器会根据统计信息(如索引的文档覆盖率、数据分布)选择更高效的索引。由于 adv_storeId 覆盖了全部文档,优化器认为它更适合此查询。

3. 验证示例

场景模拟

假设表中包含以下文档:

{ "id": 1, "storeId": 100 },    // storeId 存在
{ "id": 2, "storeId": NULL },   // storeId 为 NULL
{ "id": 3 },                    // storeId 缺失
  • 使用 idx_pi_content_storeId

    • 仅索引文档 id=1(因为 storeId 存在)。
    • 查询 SELECT storeId 会返回 [100],但遗漏 id=2id=3 的文档。
  • 使用 adv_storeId

    • 索引所有文档,包括 id=2storeId=NULL)和 id=3storeId=MISSING)。
    • 查询 SELECT storeId 会返回 [100, NULL, MISSING],结果完整。

4. 如何强制使用特定索引?

若需验证索引选择行为,可通过 USE INDEX 提示强制指定索引:

SELECT storeId 
FROM `default`:`origin`.`pi`.`pi_content` 
USE INDEX (idx_pi_content_storeId);

此时查询结果将不包含 storeId 缺失或为 NULL 的文档。


总结

索引覆盖范围适用场景
idx_pi_content_storeId仅包含 storeId 存在的文档精确查询 storeId 存在的场景
adv_storeId包含所有文档(含 MISSING/NULL需要返回完整数据的查询(如 SELECT storeId

若查询需要返回所有文档的 storeId(包括缺失或 NULL 值),必须使用 INCLUDE MISSING 的索引。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值