我有一个包含以下文档的存储桶:{“ 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]
第一个查询应该明显更快,主要是因为您正在运行一个查询而不是2。但是,由于在两个查询中都使用“ select *”,因此您将触发“数据提取”,在大多数情况下都可以,但是如果需要最大的性能,您应该尝试使用覆盖索引https://docs.couchbase.com/server/current/n1ql/n1ql-language-reference/covering-indexes.html
如@deniswsrosa所建议,选项1表现更好。由于索引具有有关查询谓词和IndexScan的所有信息,因此能够生成准确数量的文档(无误报)。结帐https://blog.couchbase.com/create-right-index-get-right-performance/
取决于有多少查询符合条件,可能会有更好的选择。由于查询需要“数据提取”,因此数据需要经过2个跃点(从数据节点到查询服务,从查询服务到客户端)。如果生成的文档少于或等于文档且尺寸较小,则选项1可以正常工作。
如果生成的文档数很高并且尺寸也很大,则可以探索以下选项。
使用覆盖查询产生文档密钥
从桶中选择SELECT meta()。id,其中x =“ x”和y =“ y”
然后使用Couchbase SDK异步API并直接从数据节点获取文档。