需要分页才能关注 Cassandra table
Need pagination for following Cassandra table
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 );
我想要 运行 2 种类型的查询 where identifier = 'user_5' and post_id = 11;
和 where identifier = 'user_5';
我想对每个查询的 10 个结果进行分页。但是,很少有查询可以具有可变的结果计数。所以最好有类似 *column* > last_record
的东西我可以使用。
请帮忙。提前致谢。
P.S: Cassandra 版本 - 3.11.6
首先,也是最重要的 - 您正在接近 Cassandra,就像在单个节点上运行的传统数据库一样。您的数据模型不支持为您的查询有效检索数据,二级索引也无济于事,因为它仍然需要到达所有节点以获取数据,因为数据将根据值分布在不同节点之间分区键((identifier, post_id)
在你的情况下) - 它可能适用于小型集群中的小数据,但当你扩展时会失败。
在 Cassandra 中,所有数据建模都从查询开始,所以如果您通过 identifier
进行查询,那么它应该是一个分区键(尽管如果某些用户会产生大分区,您可能会遇到一些问题很多消息)。在分区内你可以使用二级索引,这应该不是问题。另外,在分区内部更容易组织分页。 Cassandra原生支持向前分页,所以你只需要保持paging state between queries. In Java driver 4.6.0, the special helper class was added to support paging of results,虽然它可能不是很有效,因为它无论如何都需要从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);
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 );
我想要 运行 2 种类型的查询 where identifier = 'user_5' and post_id = 11;
和 where identifier = 'user_5';
我想对每个查询的 10 个结果进行分页。但是,很少有查询可以具有可变的结果计数。所以最好有类似 *column* > last_record
的东西我可以使用。
请帮忙。提前致谢。
P.S: Cassandra 版本 - 3.11.6
首先,也是最重要的 - 您正在接近 Cassandra,就像在单个节点上运行的传统数据库一样。您的数据模型不支持为您的查询有效检索数据,二级索引也无济于事,因为它仍然需要到达所有节点以获取数据,因为数据将根据值分布在不同节点之间分区键((identifier, post_id)
在你的情况下) - 它可能适用于小型集群中的小数据,但当你扩展时会失败。
在 Cassandra 中,所有数据建模都从查询开始,所以如果您通过 identifier
进行查询,那么它应该是一个分区键(尽管如果某些用户会产生大分区,您可能会遇到一些问题很多消息)。在分区内你可以使用二级索引,这应该不是问题。另外,在分区内部更容易组织分页。 Cassandra原生支持向前分页,所以你只需要保持paging state between queries. In Java driver 4.6.0, the special helper class was added to support paging of results,虽然它可能不是很有效,因为它无论如何都需要从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);