cassandra数据库如何更好的实现跳转翻页?
我在使用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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
cassandra从设计考虑,官方确实是不提供指定页查询的,因为他们觉得这种查询效率低。如果确实有这个需求,官方推荐的做法是:
比方你有20页结果,每页10条,当用户查询指定页比如第12页时,你的fetch size就不要每次只读10条了,可以考虑每次读50条:
第一次读取1-50
丢弃,继续读51-100
丢弃,继续读101-150,取其中的121-130,丢弃其他的
这个50的fetch size你得考虑好,不能太大也不能太小,多试几种找到最佳实践