在数据库和编程中,游标(Cursor)分页查询通常有两种常见场景:
下面分别说明。
-- 声明游标
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; -- 无数据
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;
✅ 适合:
❌ 不适合:
这是最常见、性能最好的方式。
不使用
OFFSET,而是用上一页最后一条记录的值作为游标
SELECT id, name
FROM users
WHERE id > 100
ORDER BY id
LIMIT 10;
WHERE id > 0WHERE id > 上一次最大 id✅ 优点:
{
"cursor": "eyJpZCI6MTAwfQ=="
}
后端解码:
{ "id": 100 }
SQL:
WHERE id > 100
{
"size": 10,
"sort": [
{"timestamp": "asc"},
{"_id": "asc"}
],
"search_after": [1670000000, "abc123"]
}
| 方式 | 性能 | 稳定性 | 推荐 |
|---|---|---|---|
| OFFSET | 差(深分页慢) | 易漏数据 | ❌ |
| Cursor | 好 | 稳定 | ✅ |
WHERE 排序字段 > 上一页最后值
ORDER BY 排序字段
LIMIT N
如果你指的是 某个具体技术(MySQL / PG / ES / MongoDB / Java / Python),告诉我,我可以给你完整示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。