【问题标题】:SQL pagination without offset and index column没有偏移量和索引列的 SQL 分页
【发布时间】:2019-03-11 08:33:46
【问题描述】:

我的数据库有数百万条记录,正在门户上用于向用户显示,分页是使用偏移量完成的,数据也按某些列排序,是否有任何替代解决方案来偏移和使用任何索引列例如自动递增字段或唯一字段,如果我必须使用一些不同的列进行排序,它就不起作用,即使删除该行也不会返回预期结果。

我在我的 java 应用程序中运行 sql 查询,我尝试了一种方法,只对我的查询添加限制。所以它的工作原理就像偏移量总是为零,并且根据分页逻辑限制将是(限制+偏移量)的数量

例如:用户请求每页 10 条记录并导航到 51 页

替代逻辑:limit 10 offset 500 -> limit = 510

查询看起来像

select * from history limit 510 order by log_date;

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

    -- No of rows returned 510

    rs.absolute(500);
while(rs.next()){
//store data in the object
}

但即使通过这种方式,我也会告诉数据库返回 510 条记录,如果用户导航到最后一页,它将获取所有行,这将非常低效。

【问题讨论】:

    标签: java mysql sql hbase


    【解决方案1】:

    因此,您在每次新页面请求时都会访问数据库 - 出于困惑:

    在您提供的示例中,您将所有结果集提取到 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 条记录。这是您以优化的 DB 结果集大小获取所需页面内容的有效方法。

    【讨论】:

    • 但我仍然使用offset 子句来获取结果
    • 过滤java代码中的记录是一种使用offset子句获取结果的替代方法。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 2014-07-19
      • 2012-08-25
      • 2013-08-24
      • 1970-01-01
      • 2013-03-15
      • 2012-06-04
      相关资源
      最近更新 更多