2015-07-22 71 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只能在分區鍵內強制執行集羣順序。如果你沒有指定一個,你的數據將不會被排序(至少,而不是你想要的方式)。

如果您有任何其他問題,請告訴我,我很樂意解釋。