【问题标题】:Couchbase index suggestionsCouchbase 索引建议
【发布时间】:2020-01-28 09:36:13
【问题描述】:

我有一个包含如下文档的存储桶: { “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


    【解决方案1】:

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

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

    如果生成的文档数量很高且大小也很高,您可以探索以下选项。

    1. 使用覆盖查询生成文档键

      SELECT meta().id from bucket where x = "x" and y = "y"

    2. 然后使用Couchbase SDKs Asynchronous API,直接从Data Node获取文档。

    【讨论】:

    • 我需要返回一个完整的相对大的对象,所以在我的情况下,覆盖索引不是一个选项。因此,如果我对这两个答案的理解都很好,那么在我的情况下,最好选择 1 个查询来避免 2 个同步调用(获取 id 然后获取文档)?
    • 在这种情况下,创建覆盖谓词的索引(覆盖索引),然后使用 SDK 获取文档。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-11
      • 2018-03-23
      • 1970-01-01
      • 1970-01-01
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多