扫描存储桶中的某些文档时Couchbase性能问题-超时异常

时间:2018-11-12 07:25:24

标签: indexing couchbase spring-data-couchbase

我们有一个Couchbase服务器版本Community Edition 5.1.1 build 5723

在我们的Cars存储桶中,有Car Make和它制造的Cars

两者之间的联系是Id的{​​{1}},我们将其保存为Car文档中的另一个字段(例如MySQL表中的外键)。

该存储桶只有330,000个文档。

查询要花很多时间-数十秒的查询非常简单,例如

Car Make

我们以两种方式执行查询:

  1. Couchbase的用户界面
  2. Spring启动应用程序,在7.5秒后不断收到TimeOutException

我们认为该问题是存储桶中缺少索引。

所以我们添加了一个索引:

select * from cars where model="Camry"  <-- we expect to have about 50,000 results for that

我们可以在运行时看到该索引

CREATE INDEX cars_idx ON cars(makeName, modelName, makeId, _class) USING GSI;

我们在这里缺少什么?在NoSQL DB中进行此类查询的时间是否合理?

2 个答案:

答案 0 :(得分:4)

尝试

CREATE INDEX model_idx ON cars(model);

您的索引不包括模型字段。

并且您应该为spring数据“ base_base”属性建立索引

CREATE INDEX `type_idx` ON `cars`(`_class`)

答案 1 :(得分:2)

所以,这就是我们解决问题的方式:

  1. 使用this link和@paralen答案,我们创建了多个索引来加快查询速度。
  2. 当我们知道返回的结果集很大时,我们将代码更改为使用分页,并提出了类似以下内容:
    do{
       Pageable pageable = PageRequest.of(pageNumber, SLICE_SIZE, Sort.by("id"));
       Slice slice carsRepository.findAllByModelName("Camry", pageable);
       List cars = slice.getContent();
    } while (slice.hasNext());