Couchbase执行N1QL查询报Code 4000无可用索引无法检索文档
问题原因
两个功能的底层访问逻辑完全不同,和数据是否存在无关:
- Web控制台的Documents菜单是直接走Couchbase的键值存储引擎,通过文档ID枚举拉取数据,全程不依赖查询索引,所以哪怕桶上一个索引都没有,也能正常浏览所有存储的文档,这也是你能直接看到
type字段为activity的文档的原因。 - N1QL查询走的是独立的分布式查询引擎,所有查询(包括全表扫描)必须依赖可用的索引才能调度执行,新建存储桶默认不会自动创建任何索引。你当前报错的直接原因就是
mybucket上既没有主索引,也没有能匹配type字段过滤条件的二级索引,查询引擎找不到执行路径,直接返回4000错误。
解决方法
根据使用场景选对应方案即可:
方案1:创建主索引(仅适用于测试、临时排查场景)
主索引会存储桶内所有文档的主键信息,支持任意条件的全表扫描查询,执行以下语句创建:
CREATE PRIMARY INDEX ON `default`:`mybucket`;
注意:生产环境大数据量场景禁止使用主索引承载业务查询,全表扫描性能极低,很容易耗尽查询节点资源导致服务异常。
方案2:创建匹配查询逻辑的二级索引(生产环境推荐)
针对你当前按type字段过滤的查询场景,创建针对性的二级索引可以获得极高的查询效率,执行语句:
CREATE INDEX idx_mybucket_type ON `default`:`mybucket`(`type`);
如果后续查询会同时用到多个过滤字段,可以创建联合索引进一步提升性能,比如经常同时按type和version过滤的场景,可以用以下语句建索引:
CREATE INDEX idx_mybucket_type_version ON `default`:`mybucket`(`type`,`version`);
- 索引创建完成后,可以执行下面的语句检查索引状态,确认状态为
online后,再执行你的查询语句即可正常返回结果:
SELECT * FROM system:indexes WHERE keyspace_id = 'mybucket';
- 如果之前已经创建过对应索引仍然报错,优先检查索引所在的索引节点是否存活、索引构建任务是否完成,排除索引处于pending、failed状态的情况。
内容的提问来源于stack exchange,提问作者aminrd
相关产品推荐
相关产品推荐

