Indexing 复合Couchbase 4.x全局二级索引

Indexing 复合Couchbase 4.x全局二级索引,indexing,couchbase,Indexing,Couchbase,在Couchbase 4.x中创建复合全局二级索引时,我对基于CREATEINDEX语句中提供的字段顺序的性能感到好奇 为了举例说明,让我从一个例子开始: CREATE INDEX Index_1 ON `bucket`(field1, field2) USING GSI; 现在,当我们执行以下查询时: SELECT * FROM `bucket` WHERE `bucket`.field1 = "value1" AND `bucket`.field2 = "value2"; 我

在Couchbase 4.x中创建复合全局二级索引时,我对基于CREATEINDEX语句中提供的字段顺序的性能感到好奇

为了举例说明,让我从一个例子开始:

CREATE INDEX Index_1 
 ON `bucket`(field1, field2) 
 USING GSI;
现在,当我们执行以下查询时:

SELECT * FROM `bucket`
 WHERE `bucket`.field1 = "value1"
 AND `bucket`.field2 = "value2";
我很清楚,使用Index1是显而易见的。但是,有几个案例我不清楚:

  • 如果只提供了字段2而不是字段1怎么办? 从
    bucket
    中选择*其中
    bucket
    .field2=“value2”

  • 如果field2和field1在WHERE子句中的顺序相反怎么办? 从
    bucket
    中选择*其中
    bucket
    .field2=“value2”和
    bucket
    .field1=“value1”


  • 我知道这个例子只针对2个字段,但在我的例子中,我有10个字段。在这种情况下,创建许多覆盖所有可能性的索引似乎是一个组合爆炸(阶乘甚至,如果你考虑所有可能的排序和排序是重要的)。如果缺少字段很重要,则情况更糟,因为这样您就需要对字段的可能子集进行所有可能的排序。也就是说,[(field1,field2),(field1),(field2,field1),(field2)],这只适用于2个字段。
    CREATE INDEX
    语句中的字段顺序很重要。您的查询必须包括前导字段,
    field1
    ,但也可以选择包括尾随字段。索引只有一个尾随字段,
    field2

    第一个查询将不使用索引,因为它缺少前导字段。测试索引时,请务必删除主索引,或检查计划以确保它不包含
    PrimaryScan

    如第二个示例中所示,对查询谓词重新排序不会改变索引的使用方式。所有前导字段都在
    索引Scan
    中使用,无论它们出现在查询谓词中的何处

    但是,如果索引包含两个以上的字段,例如:

    CREATE INDEX Index_2 
      ON `bucket`(field1, field2, field3, field4) 
      USING GSI;
    
    您的查询不包括第二个字段:

    SELECT * FROM `bucket`
      WHERE `bucket`.field1 = "value1" 
        // field2 not specified
        AND `bucket`.field3 = "value3";
    

    只指定了一个前导字段,因此仅使用
    field1
    谓词扫描索引。查询服务必须完成剩余的工作来过滤带有
    字段3
    值的项目。

    创建索引
    语句中的字段顺序很重要。您的查询必须包括前导字段,
    field1
    ,但也可以选择包括尾随字段。索引只有一个尾随字段,
    field2

    第一个查询将不使用索引,因为它缺少前导字段。测试索引时,请务必删除主索引,或检查计划以确保它不包含
    PrimaryScan

    如第二个示例中所示,对查询谓词重新排序不会改变索引的使用方式。所有前导字段都在
    索引Scan
    中使用,无论它们出现在查询谓词中的何处

    但是,如果索引包含两个以上的字段,例如:

    CREATE INDEX Index_2 
      ON `bucket`(field1, field2, field3, field4) 
      USING GSI;
    
    您的查询不包括第二个字段:

    SELECT * FROM `bucket`
      WHERE `bucket`.field1 = "value1" 
        // field2 not specified
        AND `bucket`.field3 = "value3";
    

    只指定了一个前导字段,因此仅使用
    field1
    谓词扫描索引。查询服务必须完成剩余的工作,以过滤带有
    字段3
    值的项目。

    谢谢您的回答。帮助巩固了我的理解。谢谢你的回答杰夫。有助于巩固我的理解。