Cassandra:如何在分页中跳过行?

Eln*_*naz 4 paging cassandra nosql

我们可以在不使用分页状态的情况下在Cassandra中使用分页吗?我的意思是,例如,如果我们想对第一页之后的第三页进行随机访问(跳转),该怎么办?

doa*_*hai 5

有个把戏。

想象你有一张桌子

CREATE TABLE (
   partition uuid,
   clustering uuid,
   column1 text,
   ...
   columnN text,
   PRIMARY KEY((partition), clustering)
)
Run Code Online (Sandbox Code Playgroud)

对于具有10行的第一页:

SELECT * FROM table LIMIT 10;
Run Code Online (Sandbox Code Playgroud)

在客户端,保存最后一行(例如第十行)的分区值。对于第二页(第11至20行):

SELECT * FROM table WHERE token(partition) > token('value_of_10th_partition') LIMIT 10;
Run Code Online (Sandbox Code Playgroud)

对于第三页(第21至30行):

SELECT * FROM table WHERE token(partition) > token('value_of_20th_partition') LIMIT 10;
Run Code Online (Sandbox Code Playgroud)

代表着

  1. 第一次,如果要到达第N页,则需要获取所有以前的N-1
  2. 您需要为每个页面保存最后一个分区值才能访问下一页。例如,如果要访问第n°34页,则需要保存第n°33页的最后一个分区值
  3. 此技术不能保证隔离,例如,在此期间,如果将新数据插入到Cassandra中,则可能会在页面中添加额外的条目,例如,第30页在插入新数据后可能不会包含相同的行。使用PagingState对象也不能解决此问题。这是因为我们不为每个页面创建快照(并且我们不想这样做,因为这样做太昂贵了),所以没有隔离