仅查询具有复合分区键第一项的所有行

Query all rows with first item of compound partition key only

我有以下列族:

CREATE TABLE test."Data" (
    "ItemID" uuid,
    "DataID" uuid,
    PRIMARY KEY (("ItemID", "DataID"))
)

我想获取具有 "ItemSourceID" = someuuid.

的所有行

之前,我有以下架构,显然效果很好:

CREATE TABLE test."Data" (
    "ItemID" uuid,
    "DataID" uuid,
    PRIMARY KEY (ItemID, "DataID")

但是我遇到了很多性能问题,因为特定 ItemID 的行太多(数百万)。

我想知道以下请求是否允许我获得特定 ItemID 的所有结果,或者是否真的不可能:

SELECT * FROM "Data" WHERE token("ItemID", "DataID") > token(e9e9ebfd-c9aa-11e4-b1a1-b8e85641b1e0, 00000000-0000-0000-0000-000000000000) LIMIT 1000;

然后将 00000000-0000-0000-0000-000000000000 替换为我得到的最后一个 UUID,直到此 itemID 不再有结果为止。基本分页。

我现在得到结果,但我不知道我是否会得到所有结果,因为我不确定令牌如何工作以及 00000000-0000-0000-0000-000000000000 是否实际上总是第一个.

我正在使用 cassandra 2.1.4。

感谢您的帮助

使用 ItemID 作为分区键和 DataID 作为集群键可能是您要考虑的数据模型。我从去年 9 月开始看到的基准表明,在现代版本的 Cassandra 中,分区中有 "millions" 个单元格应该没问题,只要它们不是墓碑(您可以在 Cassandra Summit 2014 上寻找 Patrick McFadin 的演讲从去年 9 月在 SF 中获取详细信息)。

使用令牌进行迭代是一种后备方法,但我认为您不能保证所有 0 的 UUID 实际上是第一个 - 您需要 SELECT TOKEN LIMIT 1 来找到绝对最低,然后在随后的 SELECTS.

中使用该结果标记

就我个人而言,我可能会尝试手动拆分分区 - DataID 是基于时间的(类型 1 uuids?)。如果是这样,我可能会尝试将分区分成逻辑日期块(例如每天 1 个分区)。