Indexing 复合Couchbase 4.x全局二级索引
在Couchbase 4.x中创建复合全局二级索引时,我对基于CREATEINDEX语句中提供的字段顺序的性能感到好奇 为了举例说明,让我从一个例子开始: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"; 我
CREATE INDEX Index_1
ON `bucket`(field1, field2)
USING GSI;
现在,当我们执行以下查询时:
SELECT * FROM `bucket`
WHERE `bucket`.field1 = "value1"
AND `bucket`.field2 = "value2";
我很清楚,使用Index1是显而易见的。但是,有几个案例我不清楚:
bucket
中选择*其中bucket
.field2=“value2”
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
值的项目。谢谢您的回答。帮助巩固了我的理解。谢谢你的回答杰夫。有助于巩固我的理解。