我在尝试对数据进行建模时遇到了麻烦,以至于我可以有效地查询Cassandra最近修改的最后10个(实际上是任何数量)记录.每个记录都有一个last_modified_date列,由应用程序在插入/更新记录时设置.
我已从此示例代码中排除了数据列.
主数据表(每条记录只包含一行):
CREATE TABLE record (
record_id int,
last_modified_by text,
last_modified_date timestamp,
PRIMARY KEY (record_id)
);
Run Code Online (Sandbox Code Playgroud)
我试图创建一个单独的表,它使用了一个聚类键顺序.
表(每条记录一行;仅插入最后修改日期):
CREATE TABLE record_by_last_modified_index (
record_id int,
last_modified_by text,
last_modified_date timestamp,
PRIMARY KEY (record_id, last_modified_date)
) WITH CLUSTERING ORDER BY (last_modified_date DESC);
Run Code Online (Sandbox Code Playgroud)
查询:
SELECT * FROM record_by_last_modified_index LIMIT 10
Run Code Online (Sandbox Code Playgroud)
此解决方案不起作用,因为群集顺序仅适用于具有相同分区键的记录的排序.由于每行具有不同的分区键(record_id),因此查询结果不包括预期记录.
我尝试的另一个解决方案是简单地查询Cassandra的所有record_id和last_modified_date值,对它们进行排序并选择我的应用程序中的前10条记录.这显然效率低下,并且不能很好地扩展.
我考虑的最后一个解决方案是对所有记录使用相同的分区键,并使用聚类顺序确保记录正确排序.该解决方案的问题在于,数据将无法在节点之间正确分区,因为所有记录都具有相同的分区键.这对我来说似乎不是一件好事.