通过我进行的测试,看来这些都是特别大的文档(〜2mb),并且当查询使用特定索引(在我的情况下为数组索引)时。
文件较小时似乎可以正常工作。
这发生在Couchbase仪表板,cbq或我正在使用的scala SDK中。
我正在将 Couchbase 4.6.0 与内存优化索引一起使用。
我有与此查询相关的这些索引:
CREATE INDEX `cache_partial_specific`
ON `content`(`docType`,`entityType`,`entityId`)
WHERE (`docType` = "feedCachePartial") WITH { "defer_build"=true }
CREATE INDEX `feed_cache_partial_meta`
ON `content`(`meta().id`)
WHERE (`docType` = `feedCachePartial`)
CREATE INDEX `cache_partial_index`
ON `content`((distinct (array (`url`.`id`) for `url` in `urls` end)))
WHERE (`docType` = "feedCachePartial") WITH { "defer_build"=true }
最后一个是引起麻烦的
问题:
例如运行时
SELECT * FROM content WHERE meta().id = 'cached:topic:297:grp:all'
或
SELECT * FROM content WHERE docType='feedCachePartial' AND entityId=297 and entityType='topic'
它返回文档,我在列表或URL中看到URL 13319。
但是运行时
SELECT * FROM content
WHERE docType='feedCachePartial'
AND ANY url IN urls SATISFIES url.id = 13119 END
或条件为ANY url IN urls SATISFIES url.id = 13119
未返回文档cached:topic:297:grp:all
。
max_indexer_doc_size
设置为20 MB,所以我认为这不是问题(使用其他索引时,无论返回哪种方式)。
当查看查询日志时,我看到我正在使用的该特定索引具有1个副本(该群集上总共有3个索引节点)。
我会调查该索引,并查看哪些文档会根据索引调整大小,但是我不知道该怎么做。
答案 0 :(得分:2)
检查indexer.log并查看是否由于索引键大小限制而跳过了特定的索引。如果索引未建立索引,查询将找不到该文档。如果您已经知道文档密钥和查询未被涵盖,那么最好的选择是指定USE KEYS并删除META()。id谓词,这样可以节省时间。
由于您的文档很大并且尝试进行ARRAY索引编制,因此可能已跳过。如果您知道文档密钥,则无需数组索引就可以直接使用USE KEYS获取文档并应用谓词。如果由于尺寸限制而跳过了文档,请查看此帖子https://forums.couchbase.com/t/how-to-read-max-array-seckey-size-setting-version-4-5-1-2844-community-edition-build-2844/16374
SELECT * FROM content USE KEYS "cached:topic:297:grp:all" WHERE ....
除非您要对META()。id(例如:META()。id喜欢“ xyz%”)进行搜索,否则feed_cache_partial_meta索引可能没有用。您可以使用USE KEYS。
如果文档很小,则可以像这样合并其他索引,看看它是否有效,并避免使用Intersectscans。
CREATE INDEX `cache_partial_index`
ON `content`(`docType`,`entityType`,`entityId`, DISTINCT ARRAY url.id FOR url IN urls END)
WHERE (`docType` = "feedCachePartial") WITH { "defer_build"=true };
以下博客提供了有用的信息
https://blog.couchbase.com/create-right-index-get-right-performance/ https://blog.couchbase.com/n1ql-practical-guide-second-edition/
答案 1 :(得分:0)
好的,我只是在这里进行最简单的猜测,但是在此查询中
SELECT * FROM content
where docType='feedCachePartial'
and meta().id = 'cached:topic:297:grp:all'
AND entityId=297
and entityType='topic'
AND ANY url IN c.urls SATISFIES url.id = 13119 END
“ c.urls”中的“ c”是否正确?还是第一行说SELECT * FROM content c
?