没有分页和索引列的SQL分页

时间:2019-03-11 08:33:47

标签: java mysql sql hbase

我的数据库有数百万条记录,并且在门户网站上用于显示给用户,并且使用offset进行分页,并且还按某个列对数据进行排序,是否有其他替代方法可以偏移并使用任何索引列例如自动递增字段或唯一字段,如果我必须对某些不同的列进行排序,则该行将不起作用,即使删除该行,它也不会返回预期的结果。

我在我的Java应用程序中运行sql查询,我尝试了一种仅对查询添加限制的方法。因此它的工作原理是,偏移量始终为零,限制为按分页逻辑的限制数(限制+偏移量)

Ex:用户要求每页10条记录,并导航到51页

备用逻辑:限制10偏移500->限制= 510

查询看起来像

select * from history limit 510 order by log_date;

所以在absolute的{​​{1}}方法的帮助下,我根据指定的偏移量导航到行号,并在该行之后获取结果

ResultSet

但是即使这样,我仍然告诉数据库返回510条记录,并且如果用户导航到最后一页,它将获取所有行,这将非常低效。

2 个答案:

答案 0 :(得分:0)

因此,您在每个新页面请求上都访问数据库-出于这种困惑:

在给出的示例中,您正在将所有结果集都提取到Java应用程序中,然后进行过滤。让数据库进行过滤并为您提供结果。将所需的PAGE_NUMBER发送到数据库查询本身。

select * from history limit 510 order by log_date 
OFFSET PAGE_NUMBER*MAX_ROWS_TO_SELECT  ROWS FETCH NEXT MAX_ROWS_TO_SELCET ROWS ONLY;

如以上示例中所述,您只需要获取10条记录。这是您以优化的数据库结果集大小获取所需页面内容的有效方法。

答案 1 :(得分:0)

我的解决方案仅适用于phoenix 4.7(hdp 2.5),我发现的方法是使用主键以升序对数据进行排序,如果存在复合键,则按照键的第一列对数据进行排序然后偏移量和限制会正常工作。