仅查询具有复合分区键第一项的所有行
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 个分区)。
我有以下列族:
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 个分区)。