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

时间:2015-04-25 19:33:44

标签: cassandra cassandra-2.0

我有以下列系列:

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;

然后用我收到的最后一个UUID替换00000000-0000-0000-0000-000000000000,直到这个itemID没有结果。基本分页。

我现在得到了结果,但我不知道我是否会得到所有这些,因为我不确定令牌是如何工作的,如果00000000-0000-0000-0000-000000000000实际上总是第一个。< / p>

我正在使用cassandra 2.1.4。

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

使用ItemID作为分区键,DataID作为聚类键可能是您要考虑的数据模型。我从去年9月看到的基准测试表明,在现有版本的Cassandra中,在分区中拥有“数百万”的单元格应该没问题,只要它们不是墓碑(你可以在2014年的Cassandra Summit SF中寻找Patrick McFadin的演讲)从去年9月起了解详情)。

使用令牌迭代将是一个后备,但我认为你不能保证所有0的UUID实际上是第一个 - 你想要选择TOKEN LIMIT 1来找到绝对最低值,然后使用在随后的SELECTS中产生令牌。

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

相关问题