在Cassandra索引列上使用SELECT DISTINCT是否可行?

3

如果一个Cassandra表中的列有索引,那么可以使用SELECT DISTINCT操作来查找该列的所有唯一值吗?

我的问题并不仅仅是询问如何查找非主键列的唯一值。我知道Cassandra不允许需要表扫描的查询,因为它们效率低下;在这里,索引的存在消除了对表扫描的需求。

如果我有一个这样的表:

CREATE TABLE thing (
   id uuid,
   version bigint,
   name text,
   ... data columns ...
   PRIMARY KEY ((id),version)
);
CREATE INDEX ON thing(name);

我可以使用SELECT DISTINCT id FROM thing;来获取所有thing ID。这需要从我的集群中的每个节点获得一个响应,每个响应返回其节点的键。
但是我能否使用SELECT DISTINCT name FROM thing;来获取所有thing名称?这也应该只需要从我的集群中的每个节点获得一个响应,每个响应仅通过检查其节点上的索引部分来构建。如果name是一个好的列用于索引,每个响应将比主键查询更小(名称应该比分区键少)。
1个回答

0

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

DISTINCT selection_list

selection_list 是以下之一:

  • 分区键列表(与 DISTINCT 一起使用)
  • selector AS alias、selector AS alias、...| *

其中 selector列名。文档没有限制列名的内容。

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

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)"

我对二级索引的工作原理没有深入的了解,但是我也有一种感觉:在索引列上允许DISTINCT计数不应该比查询特定值所涉及的读取更劣。 但是,由于索引值在节点之间重复,相对于结果大小而言,在内存和网络开销方面会更糟糕,因为协调器会将节点的响应压缩为仅包含唯一值。 尽管如此,对于副本系数 > 1,这也适用于分区键值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接