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

is it ok to replace count(*) with count(1) in N1ql

在某些情况下,我使用

计算 n1ql 中的所有记录
Select count(*) from bucket where type='xyz' and column1='abc'.

大约需要 25 秒,但如果我将其替换为 count(1),则需要 19 秒。 我的问题是我们可以使用 count(1) 而不是 count(*)。我相信它只计算一列总计数而不是计算所有。让我知道 n1ql 中是否不是这种情况。

  1. 关注count(1)。数据库引擎遍历整个 table,但不从中取值。 server层在每行和returns中放一个数字“1”,判断不能为空,按行累加。

  2. 关注count(*),需要从磁盘读取数据,然后累加计数。数据库引擎将总行数存储在一个table磁盘上,所以执行count(*)会直接return这个行数。如果您使用 count(*),则不会采用任何字段,并且不会有任何值 taken.Because 它是按行累积的。数据库专门针对它进行了优化。

  3. 你也可以count(PRIMARY KEY Id)。数据库引擎的Id return涉及解析数据行和复制字段值。

  4. 或者你也可以count(Field)。如果这个“字段”定义为not null,则逐行从记录中读取这个字段,判断不能为null,逐行累加;如果这个“字段”定义允许为null,那么在执行的时候判断有可能为null,需要把值取出来重新判断,不为null则累加。

最后,我们来排序一下效率:
count(*)>=count(1)>count(id)>count(field)

如果您使用的是 CB 5.0 及更高版本,则 COUNT(*) 和 COUNT(1) 的处理方式相同。

以下应该表现更好。

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