在n1ql中用count(1)替换count(*)可以吗

hs1rzwqc  于 2021-07-27  发布在  Java
关注(0)|答案(2)|浏览(342)

有一个场景,我使用

Select count(*) from bucket where type='xyz' and column1='abc'.

大约需要25秒但是如果我用 count(1) 需要19秒。我的问题我们能用吗 count(1) 而不是 count(*) . 我相信它只计算一列的总数而不是全部。如果n1ql不是这种情况,请告诉我。

v9tzhpje

v9tzhpje1#

如果使用cb 5.0及以上版本,则计数(*)和计数(1)的处理方式相同。
以下几点应该表现得更好。

CREATE INDEX ix1 ON bucket(column1) WHERE type = "xyz";
SELECT COUNT(1) AS cnt
FROM bucket
WHERE type='xyz' AND column1='abc';
4c8rllxm

4c8rllxm2#

专注于 count(1) . 数据库引擎遍历整个表,但不从中获取值。服务器层在每一行中放置一个数字“1”并返回,判断它不能为空,然后按行累加。
专注于 count(*) 。它需要从磁盘读取数据,然后累积计数。数据库引擎将表中的总行数存储在磁盘上,因此执行count(*)将直接返回这个行数。如果你使用 count(*) ,将不获取任何字段,也不获取任何值,因为它是按行累加的。数据库已经专门为此进行了优化。
你也可以 count(PRIMARY KEY Id) . 数据库引擎返回的id包括解析数据行和复制字段值。
或者你也可以 count(Field) . 如果该“字段”定义为不为空,则逐行从记录中读取该字段,判断不为空,逐行累加;如果这个“字段”定义允许为空,那么在执行时,判断有可能为空,需要取出值重新判断,如果不为空则累加。
最后,让我们对效率进行排序: count(*)>=count(1)>count(id)>count(field)

相关问题