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

Cassandra 仅使用复合分区键的第一项查询所有行,cassandra,cassandra-2.0,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

我有以下专栏:

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是否总是第一个

我使用的是卡桑德拉2.1.4


谢谢你的帮助

使用ItID作为分区键和DATAID,因为聚类密钥很可能是你想考虑的数据模型。我从去年9月看到的基准表明,在现代版本的Cassandra中,在一个分区中有“数百万”个单元应该是可以的,只要它们不是墓碑(你可以查看Patrick McFadin去年9月在旧金山举行的Cassandra Summit 2014上的演讲的细节)

使用令牌进行迭代将是一种回退,但我认为您不能保证所有0的UUID实际上都是第一位的-您应该选择令牌限制1以找到绝对最低值,然后在后续选择中使用生成的令牌


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

Datastax的一位顾问告诉我,一个分区包含的数据不应超过100000个。不幸的是,我有一些墓碑,我尝试尽可能频繁地运行压缩,但每个分区需要很长的100K单元,这正是我倾向于使用的,但这是基于在运行旧版本时过于保守。如果datastax仍然推荐这个限制,我当然会遵从他们。好的,谢谢你的回答,我会尝试使用一个自定义分区键,比如一个递增的数字,并运行一些基准测试,看看它是否有区别