在 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 中是否不是这种情况。
关注count(1)
。数据库引擎遍历整个 table,但不从中取值。 server层在每行和returns中放一个数字“1”,判断不能为空,按行累加。
关注count(*)
,需要从磁盘读取数据,然后累加计数。数据库引擎将总行数存储在一个table磁盘上,所以执行count(*)会直接return这个行数。如果您使用 count(*)
,则不会采用任何字段,并且不会有任何值 taken.Because 它是按行累积的。数据库专门针对它进行了优化。
你也可以count(PRIMARY KEY Id)
。数据库引擎的Id return涉及解析数据行和复制字段值。
或者你也可以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';
在某些情况下,我使用
计算 n1ql 中的所有记录Select count(*) from bucket where type='xyz' and column1='abc'.
大约需要 25 秒,但如果我将其替换为 count(1)
,则需要 19 秒。
我的问题是我们可以使用 count(1)
而不是 count(*)
。我相信它只计算一列总计数而不是计算所有。让我知道 n1ql 中是否不是这种情况。
关注
count(1)
。数据库引擎遍历整个 table,但不从中取值。 server层在每行和returns中放一个数字“1”,判断不能为空,按行累加。关注
count(*)
,需要从磁盘读取数据,然后累加计数。数据库引擎将总行数存储在一个table磁盘上,所以执行count(*)会直接return这个行数。如果您使用count(*)
,则不会采用任何字段,并且不会有任何值 taken.Because 它是按行累积的。数据库专门针对它进行了优化。你也可以
count(PRIMARY KEY Id)
。数据库引擎的Id return涉及解析数据行和复制字段值。或者你也可以
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';