我有以下列系列:
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。
感谢您的帮助
答案 0 :(得分:2)
使用ItemID作为分区键,DataID作为聚类键可能是您要考虑的数据模型。我从去年9月看到的基准测试表明,在现有版本的Cassandra中,在分区中拥有“数百万”的单元格应该没问题,只要它们不是墓碑(你可以在2014年的Cassandra Summit SF中寻找Patrick McFadin的演讲)从去年9月起了解详情)。
使用令牌迭代将是一个后备,但我认为你不能保证所有0的UUID实际上是第一个 - 你想要选择TOKEN LIMIT 1来找到绝对最低值,然后使用在随后的SELECTS中产生令牌。
就个人而言,我可能会尝试手动分解分区 - 基于DataID时间(类型1 uuids?)。如果是这样,我可能会尝试将分区分成逻辑日期块(例如每天1个分区)。