下面的Cassandra表格需要分页

6yt4nkrj  于 2021-06-13  发布在  Cassandra
关注(0)|答案(1)|浏览(399)
CREATE TABLE feed (
   identifier text,
   post_id int,
   score int,
   reason text,
   timestamp timeuuid,
   PRIMARY KEY ((identifier, post_id), score, id, timestamp)
) WITH CLUSTERING ORDER BY (score DESC, timestamp DESC);

CREATE INDEX IF NOT EXISTS index_identifier ON feed ( identifier );

我想运行两种类型的查询 where identifier = 'user_5' and post_id = 11; 以及 where identifier = 'user_5'; 我想对每个查询的10个结果分页。但是,很少有查询具有可变的结果计数。所以最好是有像 *column* > last_record 我可以用的。
请帮忙。提前谢谢。
p、 s:Cassandra版本- 3.11.6

gab6jxml

gab6jxml1#

首先,也是最重要的一点—您正在接近cassandra,就像一个在单个节点上运行的传统数据库一样。您的数据模型不支持为您的查询有效地检索数据,二级索引也没有多大帮助,因为它仍然需要到达所有节点才能获取数据,因为数据将根据分区键的值分布在不同的节点之间( (identifier, post_id) 在您的情况下)-它可以处理小集群中的小数据,但当您扩展时,它将失败得很惨。
在cassandra中,所有的数据建模都是从查询开始的,所以如果您是通过 identifier ,那么它应该是一个分区键(尽管如果某些用户将生成大量消息,那么在使用大分区时可能会遇到一些问题)。在分区内您可以使用二级索引,这应该不是问题。另外,在分区内部更容易组织分页。cassandra本机支持前向分页,所以您只需要在查询之间保持分页状态。在java driver 4.6.0中,添加了特殊的helper类来支持结果分页,尽管它可能不是很有效,因为它无论如何都需要从cassandra读取数据,才能跳到给定的页面,但至少它有一些帮助。以下是文档中的示例:

String query = "SELECT ...";
// organize by 20 rows per page
OffsetPager pager = new OffsetPager(20);

// Get page 2: start from a fresh result set, throw away rows 1-20, then return rows 21-40
ResultSet rs = session.execute(query);
OffsetPager.Page<Row> page2 = pager.getPage(rs, 2);

// Get page 5: start from a fresh result set, throw away rows 1-80, then return rows 81-100
rs = session.execute(query);
OffsetPager.Page<Row> page5 = pager.getPage(rs, 5);

相关问题