爲什麼想要在cassandra表中使用聚簇索引?爲什麼在Cassandra表中使用複合聚集鍵?
例如;在像這樣的表:
CREATE TABLE blah (
key text,
a text,
b timestamp,
c double,
PRIMARY KEY ((key), a, b, c)
)
羣集的部分是PRIMARY KEY
的a, b, c
一部分。
有什麼好處?有什麼考慮?
爲什麼想要在cassandra表中使用聚簇索引?爲什麼在Cassandra表中使用複合聚集鍵?
例如;在像這樣的表:
CREATE TABLE blah (
key text,
a text,
b timestamp,
c double,
PRIMARY KEY ((key), a, b, c)
)
羣集的部分是PRIMARY KEY
的a, b, c
一部分。
有什麼好處?有什麼考慮?
集羣密鑰做三件事情。
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';
正如你所看到的,dcid
和productid
聚集鍵允許我對高位運行,執行查詢我的分區密鑰(customerid
)儘可能集中,我可能需要。
缺點?如果我想查詢單個DC的所有產品,不管客戶如何,我都不能。我需要建立一個不同的查詢表來支持這個。即使我只想查詢一種產品,我也不能,除非我還提供customerid
和dcid
。
如果我希望以某種方式訂購我的數據,該怎麼辦?在這個例子中,我將從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';
當返回的值,他們將在DESC
由eventtime
結尾的順序。
當然,每個人(與RDBMS背景...所以是,大家)想知道的一個問題是,如何查詢所有按eventtime
排序的結果?而且,你不能。當然,您可以通過省略WHERE子句來查詢所有行,但不會返回按照任何有意義順序排序的數據。重要的是要記住,Cassandra只能在分區鍵內強制執行集羣順序。如果你沒有指定一個,你的數據將不會被排序(至少,而不是你想要的方式)。
如果您有任何其他問題,請告訴我,我很樂意解釋。