当前位置: 首页 > 知识库问答 >
问题:

分页查询的最佳实践及其应用场景?

毕宏盛
2023-07-23

问题描述

当前分页查询已经不局限于传统的通过用户单击页码栏实现分页

比如微博的首页就实现了滚动实时分页

所以出于好奇想问问大佬当前分页查询都有哪些成熟的实现方案,其各自的适用场景是什么

共有1个答案

商高谊
2023-07-23

首先题主要分清 外在功能内在实现

功能

滚动实时分页,并不会规定死实现的方式,limit + offset 的形式完全可以实现,只不过参数从用户点击到监听滚动事件,这是前端需要处理的

对于后端的视角来说,依旧是接口被调用,得到对应页码,不需要 更改分页代码

实现

当然,本身实现分页的模式也是不止这一种

  • 使用游标 Cursor 实现

      DELIMITER //  CREATE PROCEDURE get_paged_data(IN start_index INT, IN page_size INT)  BEGIN    DECLARE done INT DEFAULT FALSE;    DECLARE cursor_name CURSOR FOR      SELECT * FROM your_table LIMIT start_index, page_size;    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;    OPEN cursor_name;    read_loop: LOOP      FETCH cursor_name INTO @column1, @column2; -- 根据实际列名进行调整      IF done THEN        LEAVE read_loop;      END IF;      -- 可以在这块处理和显示数据逻辑,比如说输出或存储到缓存    END LOOP;    CLOSE cursor_name;  END //  DELIMITER ;
  • 子查询

    • 这个个人感觉差别不大,据说某些场景性能会高点

      SELECT column1, column2FROM your_tableWHERE id IN (  SELECT id  FROM table  ORDER BY column1  LIMIT start_index, page_size -- 分页索引);
  • 窗口函数

    • ROW_NUMBER() 可以为每一行数据生成一个行号

      SELECT column1, column2FROM (  SELECT column1, column2,         ROW_NUMBER() OVER (ORDER BY some_column) AS row_num  FROM your_table) AS subqueryWHERE row_num BETWEEN start_index AND end_index; -- 分页索引
参考
mysql 官方文档 - 窗口函数
mysql 官方文档 - 子查询
mysql 官方文档 - 游标
 类似资料:
  • 我希望一些帮助处理一个奇怪的边缘案例与我正在构建的一个分页API。 与许多API一样,这个API分页了大量的结果。如果查询/foos,将得到100个结果(即foo#1-100),以及一个指向/foos?page=2的链接,该链接将返回foo#101-200。 不幸的是,如果在API使用者进行下一个查询之前从数据集中删除了foo#10,/foos?page=2将抵消100并返回foos#102-20

  • 问题内容: 我有一个使用 像素 渲染页面的网站。但是,当我在具有不同屏幕分辨率的不同设备中查看网站时, 整个页面将无法容纳在屏幕中 ,如果我使用 百分比 ,页面内容将会 受到挤压 。 是响应式网页设计是设计网页的正确选择。如果是这样,我几乎不用担心。 将现有网站转换为包含响应式设计所涉及的风险是什么? 有没有可用的框架来做到这一点,哪个是最好的框架 设备和浏览器如何支持它 问题答案: 使用媒体查询

  • 我有一个Excel文件,上面有一长串用户名。ColA包含旧用户名ColB包含新用户名。我想在基于excel文件的SQL表中重命名用户。我的问题是:在循环中使用using语句多次调用SQL可以吗?还是有更好的方法,我打开一个连接,让所有的SQL更新查询“一”?

  • 问题内容: 在我们当前的自动化中(使用Selenium / WebDriver / Java),我们使用 非常 广泛。例如: 根据定义,可以使用以下内容找到选择器:using,id,名称,className,css,tagName,linkText,partialLinkText和xpath。 最近,我们的前端开发人员提议我们实现一个以’test =’开头的新属性类。我认为这是一个好主意,因为我们

  • 这里有些给使用和编写 Ansible playbook 的贴士. 你能在我们的 ansible-example repository.找到展示这些最佳实践的 playbook 样例.(注意: 这些示例用的也许不是最新版的中所有特性,但它们仍旧是极佳的参考.) Topics 最佳实践 接下来的章节将向你展示一种组织 playbook 内容方式. 你对 Ansible 的使用应该符合你的需求而不是我们

  • 处理后台任务与常规调用方法有很大的不同。本指南旨在帮助让您的后台任务平稳有效地运行。本文基于 这篇博客文章。 使任务参数小而简单 方法(任务)在调用之前会被序列化。使用 TypeConverter 类将参数转换为 JSON 字符串。如果您有复杂的实体和 / 或大对象; 包括数组,最好将它们放入数据库,然后只将其标识 (id) 传递给后台任务。 错误例子: public void Method(En