为什么在 Cassandra 表中使用复合聚集键?
Why use a compound clustered key in Cassandra tables?
为什么要在 cassandra 中使用聚集索引 table?
例如;在这样的 table 中:
CREATE TABLE blah (
key text,
a text,
b timestamp,
c double,
PRIMARY KEY ((key), a, b, c)
)
聚类部分是 PRIMARY KEY
的 a, b, c
部分。
有什么好处?有哪些注意事项?
集群键主要做三件事。
1) 它们会影响您的 table.
的可用查询模式
2) 它们确定您的 table.
的磁盘排序顺序
3) 它们决定了你的主键的唯一性。
假设我 运行 有一个订购系统并且想在我的网站上存储产品数据。此外,我还有几个配送中心,以及客户合同定价。因此,当某个客户访问我的网站时,他们只能访问以下产品:
在其地理区域的配送中心 (DC) 有售。
在他们的合同中定义(因此他们不一定可以访问 DC 中的所有产品)。
为了跟踪这些产品,我将创建一个如下所示的 table:
CREATE TABLE customerDCProducts (
customerid text,
dcid text,
productid text,
productname text,
productPrice int,
PRIMARY KEY (customerid, dcid, productid));
对于此示例,如果我想查看 DC 1138 中客户 B-26354 的产品 123,我可以使用此查询:
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 的所有产品,无论客户如何,我都不能。我需要构建一个不同的查询 table 来支持它。即使我只想查询一种产品,除非我还提供 customerid
和 dcid
.
,否则我不能
如果我希望我的数据以某种方式排序怎么办?对于这个例子,我将从 Patrick McFadin 关于 Getting Started With Time Series Data Modeling 的文章中得到启发,并构建一个 table 来跟踪气象站的最新温度。
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';
当这些值被 return 编辑时,它们将按 DESC
结束顺序 eventtime
。
当然,每个人(具有 RDBMS 背景...所以是的,每个人)都想知道的一个问题是如何查询按 [= 排序的所有结果21=]?再一次,你不能。当然,您可以通过省略 WHERE 子句来查询所有行,但这不会 return 您的数据以任何有意义的顺序排序。请务必记住,Cassandra 只能在分区键 内执行集群顺序。如果您不指定一个,您的数据将不会被排序(至少,不会以您希望的方式排序)。
如果您有任何其他问题,请告诉我,我们很乐意为您解释。
为什么要在 cassandra 中使用聚集索引 table?
例如;在这样的 table 中:
CREATE TABLE blah (
key text,
a text,
b timestamp,
c double,
PRIMARY KEY ((key), a, b, c)
)
聚类部分是 PRIMARY KEY
的 a, b, c
部分。
有什么好处?有哪些注意事项?
集群键主要做三件事。
1) 它们会影响您的 table.
的可用查询模式2) 它们确定您的 table.
的磁盘排序顺序3) 它们决定了你的主键的唯一性。
假设我 运行 有一个订购系统并且想在我的网站上存储产品数据。此外,我还有几个配送中心,以及客户合同定价。因此,当某个客户访问我的网站时,他们只能访问以下产品:
在其地理区域的配送中心 (DC) 有售。
在他们的合同中定义(因此他们不一定可以访问 DC 中的所有产品)。
为了跟踪这些产品,我将创建一个如下所示的 table:
CREATE TABLE customerDCProducts (
customerid text,
dcid text,
productid text,
productname text,
productPrice int,
PRIMARY KEY (customerid, dcid, productid));
对于此示例,如果我想查看 DC 1138 中客户 B-26354 的产品 123,我可以使用此查询:
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 的所有产品,无论客户如何,我都不能。我需要构建一个不同的查询 table 来支持它。即使我只想查询一种产品,除非我还提供 customerid
和 dcid
.
如果我希望我的数据以某种方式排序怎么办?对于这个例子,我将从 Patrick McFadin 关于 Getting Started With Time Series Data Modeling 的文章中得到启发,并构建一个 table 来跟踪气象站的最新温度。
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';
当这些值被 return 编辑时,它们将按 DESC
结束顺序 eventtime
。
当然,每个人(具有 RDBMS 背景...所以是的,每个人)都想知道的一个问题是如何查询按 [= 排序的所有结果21=]?再一次,你不能。当然,您可以通过省略 WHERE 子句来查询所有行,但这不会 return 您的数据以任何有意义的顺序排序。请务必记住,Cassandra 只能在分区键 内执行集群顺序。如果您不指定一个,您的数据将不会被排序(至少,不会以您希望的方式排序)。
如果您有任何其他问题,请告诉我,我们很乐意为您解释。