为什么想要在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只能在分区键内强制执行集群顺序。如果你没有指定一个,你的数据将不会被排序(至少,而不是你想要的方式)。
如果您有任何其他问题,请告诉我,我很乐意解释。