CouchBase稀疏索引和全量索引的对比
下面两个couchbase索引对比,为什么有where条件的查询很慢,没有where条件的很快,是什么原理?
CREATE INDEX adv_updated_atDESC ON datamesh.datamesh.data_products
(updated_at DESC) WHERE (updated_at is not missing)
CREATE INDEX adv_updated_atDESC ON datamesh.datamesh.data_products
(updated_at DESC INCLUDE MISSING)
这两个索引虽然都以 updated_at
的降序排列,但它们在处理缺失值的方式上有本质区别,从而影响了查询计划和性能:
-
带 WHERE 条件的索引(稀疏索引)
这个索引只包含updated_at
不缺失的文档,即索引是稀疏的。虽然稀疏索引通常更小,但在查询时如果查询条件中再次显式使用了updated_at is not missing
,查询引擎可能需要在扫描索引时额外验证每条记录是否满足这个条件,甚至可能导致无法利用索引的覆盖特性,从而增加了额外的过滤步骤。 -
INCLUDE MISSING 的索引(全量索引)
这个索引则会为所有文档建立索引,并用特殊标记包含缺失值。这样索引是完整的,查询引擎可以直接通过索引完成扫描(甚至实现覆盖查询),而无需再对文档是否满足某个条件做额外检查,因此性能更好。
总结原理:
稀疏索引虽然减少了索引体积,但在查询时必须在索引扫描中额外执行过滤判断;而全量索引(带 INCLUDE MISSING)由于索引中已经包含所有文档,查询引擎可以利用更连续的索引结构和覆盖索引优化,从而加快查询速度。
因此,当查询条件中带有对缺失值的判断时,稀疏索引可能会因为额外的过滤和匹配逻辑导致性能下降,而全量索引则能更高效地支持这类查询。