2015-07-22 77 views
2

为什么想要在cassandra表中使用聚簇索引?为什么在Cassandra表中使用复合聚集键?

例如;在像这样的表:

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

群集的部分是PRIMARY KEYa, b, c一部分。

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

回答

4

集群密钥做三件事情。

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

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

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

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

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

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

为了保持这些产品的赛道,我将创建一个表,看起来像这样:

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

在这个例子中,如果我想看到产品123,在DC 1138,为客户B-26354,我可以用这个查询:

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

也许是我想看到的DC 1138提供的产品为用户B-26354:

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

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

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

正如你所看到的,dcidproductid聚集键允许我对高位运行,执行查询我的分区密钥(customerid)尽可能集中,我可能需要。

缺点?如果我想查询单个DC的所有产品,不管客户如何,我都不能。我需要建立一个不同的查询表来支持这个。即使我只想查询一种产品,我也不能,除非我还提供customeriddcid

如果我希望以某种方式订购我的数据,该怎么办?在这个例子中,我将从Patrick McFadin的文章Getting Started With Time Series Data Modeling中得到一个提示,并建立一个表格来跟踪气象站的最新气温。

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

通过集群上eventtime,并指定结束ORDER BY一个DESC,我可以查询记录的温度像这样的特定站:

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

当返回的值,他们将在DESCeventtime结尾的顺序。

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

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