我们有Couchbase
服务器版本Community Edition 5.1.1 build 5723
在我们的Cars
铲斗中,我们有它制造的Car Make
和Cars
。
两者之间的连接是Car Make
的Id
,我们将其保存为Car文档中的另一个字段(就像MySQL表中的外键(。
这个bucket只有33万份文档。
查询需要花费大量时间-对于非常简单的查询(如(需要数十秒
select * from cars where model="Camry" <-- we expect to have about 50,000 results for that
我们以两种方式执行查询:
- 沙发座的用户界面
- 一个Spring启动应用程序,在7.5秒后不断获得TimeOutException
我们认为问题是缺少bucket的索引。
所以我们添加了一个索引:
CREATE INDEX cars_idx ON cars(makeName, modelName, makeId, _class) USING GSI;
我们可以在运行时看到该索引
SELECT * FROM system:indexes
我们这里缺少什么?在NoSQL数据库中进行此类查询的时间是否合理?
尝试
CREATE INDEX model_idx ON cars(model);
您的索引不包括模型字段。
您应该有spring数据couchbase"_class"属性的索引
CREATE INDEX `type_idx` ON `cars`(`_class`)
所以,这就是我们解决问题的方法:
- 使用这个链接和@palalenanswer,我们创建了几个索引来加快查询速度
- 当我们知道返回的结果集很大时,我们修改了代码以使用分页,并得出了这样的结果:
do{Pageable Pageable=PageRequest.of(pageNumber,SLICE_SIZE,Sort.by("id"((;切片汽车Resetory.findAllByModelName("凯美瑞",可分页(;列出汽车=slice.getContent((;}while(slice.hasNext(((