Count查询在Couchbase中运行太慢

Count查询在Couchbase中运行太慢,couchbase,n1ql,Couchbase,N1ql,我在Spring应用程序中使用couchbase:community-6.0.0。我在数据库里有25万条记录。我的数据库查询速度非常快,无需使用COUNT query命令 SELECT app.*, META(app).id AS id FROM app WHERE ( deleted = FALSE OR deleted IS MISSING ) AND _class = “com.myexample.app.device.data.model.DeviceEntity” AND appI

我在Spring应用程序中使用couchbase:community-6.0.0。我在数据库里有25万条记录。我的数据库查询速度非常快,无需使用COUNT query命令

SELECT app.*, META(app).id AS id FROM app WHERE ( deleted = FALSE OR 
deleted IS MISSING ) AND _class = 
“com.myexample.app.device.data.model.DeviceEntity” AND appId = 
“something” AND dp.language = “somelanguage” LIMIT 100 OFFSET 0
此查询运行良好且快速…响应时间小于50毫秒

然而

SELECT COUNT(*) AS count FROM app WHERE ( deleted = FALSE OR deleted 
IS MISSING ) AND _class = 
“com.myexample.app.device.data.model.DeviceEntity” AND appId = 
“something”
需要1分钟。我不能减少

索引

主要的,重要的 在
app
上创建索引
class\u appId\u idx
\u class
appId

app
上创建索引
ix1
\u class
appId
,如果缺少(
deleted
,false))

这个问题的解决办法是什么?我认为索引不适用于计数?请问有什么建议,我怎样才能做到这一点


注意:我尝试使用EE edition,但没有成功。

系统无法将索引与查询匹配。有时候,优化器并不那么聪明。试试这个:

create index ix_test on test(_class, appId) WHERE deleted = FALSE OR deleted IS MISSING
这将使用索引


一般来说,由于我们如何构建索引,我们遇到了IS缺失子句的问题。但是,在索引的WHERE子句中加入这一点可以使它起作用。但这是一个非常专门的索引。考虑改变你的数据,所以“删除”字段总是存在。

< P>它使用MyStudio-60.0

在实际情况下工作。它实际上不起作用,我删除了旧索引并使用了您的命令。什么都没变。我的查询是从app中选择COUNT(*)作为COUNT,其中(
deleted
=false)或(
deleted
缺失))和_class=“com.myexample.appconnect.device.data.model.DeviceEntity”和
appId
=“something”:/我实际上删除了包括主索引在内的所有索引。您是否将FROM子句从“test”更改为“app”?如果不是的话,我只能说我的couchbase版本和你的版本之间肯定有一些细微的差别。在这种情况下,我建议您考虑更改数据模型,这样“删除”总是存在的。这将使查询更直观,索引更简单。您可以尝试的另一件事是像这样重写您的查询
SELECT COUNT(*)AS COUNT FROM test,其中IFMISSING(deleted,false)=false和_class=“com.myexample.app.device.data.model.DeviceEntity”和appId=“something”
并使用如下索引:
在测试时创建索引ix\u test\u im(\u class,appId,IFMISSING(deleted,false))
我将测试更改为app mate。谢谢你的建议。我甚至不明白为什么响应时间持续1分钟左右。它告诉我在IndexScan3步骤后,在FETCH中,损失大约45-50秒。不过,谢谢你的帮助。我已经尝试了你最后的问题,它需要更好的。26.63秒而不是1分钟。仍然需要减少:/