Couchbase索引建议

问题描述 投票:1回答:2

我有一个包含以下文档的存储桶:{“ x”:“ x”,“ y”:“ y”,“Z Z”,// ...}

而且我有2个属性(x,y)的GSI索引。

如果我想通过x和y查询文档,我想知道这些情况中哪个更有效:

1- SELECT * from bucket where x = "x" and y = "y"

2- 
    * SELECT meta().id from bucket where x = "x" and y = "y"
    * SELECT * from bucket USE KEYS [The keys returned by previous query]
couchbase n1ql
2个回答
1
投票

第一个查询应该明显更快,主要是因为您正在运行一个查询而不是2。但是,由于在两个查询中都使用“ select *”,因此您将触发“数据提取”,在大多数情况下都可以,但是如果需要最大的性能,您应该尝试使用覆盖索引https://docs.couchbase.com/server/current/n1ql/n1ql-language-reference/covering-indexes.html


1
投票

如@deniswsrosa所建议,选项1表现更好。由于索引具有有关查询谓词和IndexScan的所有信息,因此能够生成准确数量的文档(无误报)。结帐https://blog.couchbase.com/create-right-index-get-right-performance/

取决于有多少查询符合条件,可能会有更好的选择。由于查询需要“数据提取”,因此数据需要经过2个跃点(从数据节点到查询服务,从查询服务到客户端)。如果生成的文档少于或等于文档且尺寸较小,则选项1可以正常工作。

如果生成的文档数很高并且尺寸也很大,则可以探索以下选项。

  1. 使用覆盖查询产生文档密钥

    从桶中选择SELECT meta()。id,其中x =“ x”和y =“ y”

  2. 然后使用Couchbase SDK异步API并直接从数据节点获取文档。

© www.soinside.com 2019 - 2024. All rights reserved.