cassandra数据库如何更好的实现跳转翻页?

发布于 2022-09-03 09:38:46 字数 766 浏览 23 评论 0

我在使用Cassandra数据库做分页功能,要实现的是那种能给出页数,例如可以从第1页跳到第3页的翻页方式,而不是仅仅给出“上一页”、“下一页”等功能。

产生这个问题的原因是Cassandra目前还不支持offset偏移量,他的limit只能带一个参数。
用mysql的话我们可以这样写:

select * from table limit 1,10

然而在cassandra中就只能:

select * from table limit 1

由于要跳转至第3页肯定要知道从数据库中取数据的起始地址,所以没有这个特性就很麻烦了。
而且在Cassandra的查询中,因为不支持自增的id,通常要使用token()函数来查询,举例:

select * from table where token(name) > token('test') limit 10

目前我有一个笨拙的解决办法是,记录每一次查询的最后一项的主键,以此为依据去进行下一次查询。同时传入当前页面的页数,当页数不为1时,循环进行查询,以求拿到上一次查询的最后一条结果。
如果是后面页数比较大的情况下,这种方法就要对数据库查询很多次。
翻了stackoverflow和cassandra的文档,好像也没有什么好的解决办法。
在datastax.org网站上倒是提到过cassandra推出的auto paging,可惜对我这种情况好像不太适用。

所以想问大家有没有什么好的办法,更优雅的实现跳转翻页?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

悸初 2022-09-10 09:38:47

cassandra从设计考虑,官方确实是不提供指定页查询的,因为他们觉得这种查询效率低。如果确实有这个需求,官方推荐的做法是:

比方你有20页结果,每页10条,当用户查询指定页比如第12页时,你的fetch size就不要每次只读10条了,可以考虑每次读50条:

  1. 第一次读取1-50

  2. 丢弃,继续读51-100

  3. 丢弃,继续读101-150,取其中的121-130,丢弃其他的

这个50的fetch size你得考虑好,不能太大也不能太小,多试几种找到最佳实践

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文