Select 在Cassandra索引列上选择DISTINCT是否有效

Select 在Cassandra索引列上选择DISTINCT是否有效,select,indexing,cassandra,distinct,Select,Indexing,Cassandra,Distinct,如果某列上有索引,是否可以使用CassandraSELECT DISTINCT操作查找该列的所有唯一值 我的问题与简单地问如何做不同。我意识到Cassandra不允许需要表扫描的查询,因为它们效率低下;在这里,索引的存在消除了表扫描的需要 如果我有这样一张桌子: CREATE TABLE thing ( id uuid, version bigint, name text, ... data columns ... PRIMARY KEY ((id),version

如果某列上有索引,是否可以使用Cassandra
SELECT DISTINCT
操作查找该列的所有唯一值

我的问题与简单地问如何做不同。我意识到Cassandra不允许需要表扫描的查询,因为它们效率低下;在这里,索引的存在消除了表扫描的需要

如果我有这样一张桌子:

CREATE TABLE thing (
   id uuid,
   version bigint,
   name text,
   ... data columns ...
   PRIMARY KEY ((id),version)
);
CREATE INDEX ON thing(name);
我可以
从事物中选择不同的id获取所有的东西ID。这要求集群中的每个节点都有一个响应,每个响应都返回其节点的密钥

但是我可以从事物中选择不同的名称吗获取所有东西的名称?这也应该只需要集群中每个节点的一个响应,每个响应仅通过检查其节点上的索引部分构建。如果
name
是一个很好的列,可以在该列上建立索引,那么每个响应都会比主键的查询小(名称应该比分区键少)。

至少对我来说,这表明我应该能够选择任何列的不同值:

不同选择列表

选择列表是以下选项之一:

  • 分区键列表(与DISTINCT一起使用)
  • 选择器作为别名,选择器作为别名*
其中,
选择器
列名
。文档对列名没有限制

事实上,您只能对分区键列使用DISTINCT(C*2.2.4)。在任何其他情况下使用它都会产生错误:

cqlsh:stresscql> SELECT distinct name FROM thing ;
InvalidRequest: code=2200 [Invalid query] message="SELECT DISTINCT queries must only request partition key columns and/or static columns (not name)"
我对二级索引的工作原理没有任何深入的了解,但我也有一种感觉,就产生的读取而言,允许对索引列进行不同计数不应该比查询索引中的特定值更糟糕。 但当索引值在节点间重复时,相对于结果大小而言,内存和网络开销会更大,因为协调器会将节点的响应压缩为仅包含唯一值。 不过,对于复制因子>1,分区键值也是如此