有一个场景,我使用
Select count(*) from bucket where type='xyz' and column1='abc'.
大约需要25秒但是如果我用 count(1) 需要19秒。我的问题我们能用吗 count(1) 而不是 count(*) . 我相信它只计算一列的总数而不是全部。如果n1ql不是这种情况,请告诉我。
count(1)
count(*)
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';
4c8rllxm2#
专注于 count(1) . 数据库引擎遍历整个表,但不从中获取值。服务器层在每一行中放置一个数字“1”并返回,判断它不能为空,然后按行累加。专注于 count(*) 。它需要从磁盘读取数据,然后累积计数。数据库引擎将表中的总行数存储在磁盘上,因此执行count(*)将直接返回这个行数。如果你使用 count(*) ,将不获取任何字段,也不获取任何值,因为它是按行累加的。数据库已经专门为此进行了优化。你也可以 count(PRIMARY KEY Id) . 数据库引擎返回的id包括解析数据行和复制字段值。或者你也可以 count(Field) . 如果该“字段”定义为不为空,则逐行从记录中读取该字段,判断不为空,逐行累加;如果这个“字段”定义允许为空,那么在执行时,判断有可能为空,需要取出值重新判断,如果不为空则累加。最后,让我们对效率进行排序: count(*)>=count(1)>count(id)>count(field)
count(PRIMARY KEY Id)
count(Field)
count(*)>=count(1)>count(id)>count(field)
2条答案
按热度按时间v9tzhpje1#
如果使用cb 5.0及以上版本,则计数(*)和计数(1)的处理方式相同。
以下几点应该表现得更好。
4c8rllxm2#
专注于
count(1)
. 数据库引擎遍历整个表,但不从中获取值。服务器层在每一行中放置一个数字“1”并返回,判断它不能为空,然后按行累加。专注于
count(*)
。它需要从磁盘读取数据,然后累积计数。数据库引擎将表中的总行数存储在磁盘上,因此执行count(*)将直接返回这个行数。如果你使用count(*)
,将不获取任何字段,也不获取任何值,因为它是按行累加的。数据库已经专门为此进行了优化。你也可以
count(PRIMARY KEY Id)
. 数据库引擎返回的id包括解析数据行和复制字段值。或者你也可以
count(Field)
. 如果该“字段”定义为不为空,则逐行从记录中读取该字段,判断不为空,逐行累加;如果这个“字段”定义允许为空,那么在执行时,判断有可能为空,需要取出值重新判断,如果不为空则累加。最后,让我们对效率进行排序:
count(*)>=count(1)>count(id)>count(field)