2

为什么要在 cassandra 表中使用聚集索引?

例如; 在这样的表中:

CREATE TABLE blah (
  key text,
  a text,
  b timestamp,
  c double,
  PRIMARY KEY ((key), a, b, c)
)

聚集的部分a, b, cPRIMARY KEY.

有什么好处?有哪些考虑?

4

1 回答 1

4

聚类键主要做三件事。

1) 它们会影响您的表的可用查询模式。

2)它们确定您的表的磁盘排序顺序。

3)它们决定了你的主键的唯一性。

假设我运行一个订购系统并想在我的网站上存储产品数据。此外,我有几个配送中心,以及客户合同定价。因此,当某个客户在我的网站上时,他们只能访问以下产品:

  • 在其地理区域的配送中心 (DC) 中可用。

  • 在他们的合同中定义(因此他们可能不一定有权访问 DC 中的所有产品)。

为了跟踪这些产品,我将创建一个如下所示的表:

CREATE TABLE customerDCProducts (
  customerid text,
  dcid text,
  productid text,
  productname text,
  productPrice int,
  PRIMARY KEY (customerid, dcid, productid));

对于此示例,如果我想查看客户 B-26354 的 DC 1138 中的产品 123,我可以使用以下查询:

SELECT * FROM customerDCProducts
WHERE customerid='B-26354' AND dcid='1138' AND productid='123';

也许我想查看适用于客户 B-26354 的 DC 1138 产品:

SELECT * FROM customerDCProducts 
WHERE customerid='B-26354' AND dcid='1138';

也许我只想查看客户 B-26354 的所有 DC 中的所有产品:

SELECT * FROM customerDCProducts 
WHERE customerid='B-26354';

正如您所看到的, 和 的集群键dcid允许productid我在我的分区键 ( ) 上运行高性能查询,customerid这些查询尽可能集中在我需要的地方。

缺点?如果我想查询单个 DC 的所有产品,无论客户如何,我都不能。我需要建立一个不同的查询表来支持它。即使我只想查询一个产品,除非我还提供一个customeridand , 否则我不能dcid

如果我希望我的数据以某种方式排序怎么办?对于此示例,我将从 Patrick McFadin 关于时间序列数据建模入门的文章中获得启发,并构建一个表格来跟踪气象站的最新温度。

CREATE TABLE latestTemperatures (
  weatherstationid text,
  eventtime timestamp,
  temperature text,
  PRIMARY KEY (weatherstationid,eventtime),
) WITH CLUSTERING ORDER BY (eventtime DESC);

通过在 上进行聚类eventtime并指定DESC结束 ORDER BY,我可以查询特定站点的记录温度,如下所示:

SELECT * FROM latestTemperatures 
WHERE weatherstationid='1234ABCD';

当这些值被返回时,它们将按DESC结束顺序排列eventtime

当然,每个人(具有 RDBMS 背景......所以是的,每个人)都想知道的一个问题是,如何查询所有排序的结果eventtime?再说一次,你不能。当然,您可以通过省略 WHERE 子句来查询所有行,但这不会返回以任何有意义的顺序排序的数据。重要的是要记住 Cassandra 只能在分区键中强制执行集群顺序。如果您不指定一个,您的数据将不会被排序(至少,不是按照您想要的方式)。

如果您有任何其他问题,请告诉我,我很乐意为您解释。

于 2015-07-22T02:44:34.713 回答