温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Cursor游标如何分页查询

发布时间:2026-08-31 18:49:48 来源:亿速云 阅读:96 作者:小樊 栏目:数据库

在数据库和编程中,游标(Cursor)分页查询通常有两种常见场景:

  1. 数据库游标(如 MySQL / PostgreSQL 的 Cursor / 游标变量)
  2. 应用层游标分页(如 Elasticsearch、MongoDB、API 中的 cursor-based pagination)

下面分别说明。


一、数据库中的游标分页(SQL 游标)

1. 使用 SQL 游标(以 PostgreSQL / MySQL 为例)

PostgreSQL 游标示例

-- 声明游标
DECLARE cur CURSOR FOR
SELECT id, name FROM users ORDER BY id;

-- 每次取 10 条
FETCH 10 FROM cur;

下次继续执行:

FETCH 10 FROM cur;

直到:

FETCH 0 FROM cur; -- 无数据

MySQL 游标(存储过程)

DECLARE done INT DEFAULT FALSE;
DECLARE cur CURSOR FOR
  SELECT id, name FROM users ORDER BY id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

OPEN cur;
read_loop: LOOP
  FETCH cur INTO v_id, v_name;
  IF done THEN
    LEAVE read_loop;
  END IF;
END LOOP;
CLOSE cur;

✅ 适合:

  • 大数据量导出
  • 后台任务

❌ 不适合:

  • Web 接口高频分页(游标是会话级、有状态)

二、游标分页(Cursor-based Pagination,推荐)

这是最常见、性能最好的方式。

核心思想

不使用 OFFSET,而是用上一页最后一条记录的值作为游标

示例(按 ID 分页)

SELECT id, name
FROM users
WHERE id > 100
ORDER BY id
LIMIT 10;
  • 第一次:WHERE id > 0
  • 第二次:WHERE id > 上一次最大 id

✅ 优点:

  • 性能稳定(不受页数影响)
  • 避免数据重复 / 漏数据

加密游标(推荐做法)

{
  "cursor": "eyJpZCI6MTAwfQ=="
}

后端解码:

{ "id": 100 }

SQL:

WHERE id > 100

三、Elasticsearch 游标分页(search_after)

{
  "size": 10,
  "sort": [
    {"timestamp": "asc"},
    {"_id": "asc"}
  ],
  "search_after": [1670000000, "abc123"]
}

四、对比:OFFSET vs Cursor

方式 性能 稳定性 推荐
OFFSET 差(深分页慢) 易漏数据
Cursor 稳定

五、总结

  • 数据库游标:适合批处理,不适合 Web
  • Cursor 分页:Web / API 最佳实践
  • 核心公式:
WHERE 排序字段 > 上一页最后值
ORDER BY 排序字段
LIMIT N

如果你指的是 某个具体技术(MySQL / PG / ES / MongoDB / Java / Python),告诉我,我可以给你完整示例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI