0Pricing
SQL Academy · 课时

LIMIT、OFFSET 与分页基础

使用 LIMIT 和 OFFSET 为大型结果集分页,理解性能权衡,并使用键集分页实现稳定滚动。

LIMIT、OFFSET 与分页基础 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。

LIMIT:限制结果数量

LIMIT n 最多返回 n 行:

SELECT * FROM products
ORDER BY created_at DESC
LIMIT 10;

OFFSET:跳过前 N 行

OFFSET k 会跳过前 k 行:

-- Rows 11–20 (the second page of 10):
SELECT * FROM products
ORDER BY created_at DESC
LIMIT 10 OFFSET 10;

分页 = LIMIT + OFFSET

经典的页码分页模式:

-- Page p (1-based), page size s:
SELECT * FROM articles
ORDER BY published_at DESC
LIMIT s OFFSET (p - 1) * s;

为什么 OFFSET 会变慢

OFFSET 在内部仍然会读取每一行被跳过的行:

  • 第 1 页,每页 10 行 → 读取 10 行
  • 第 1000 页,每页 10 行 → 读取 10,000 行
  • 第 1,000,000 页 → 读取一千万行

OFFSET 的复杂度是 O(offset)。对于很深的页面,这种方式无法使用。

键集分页(“查找方法”)

记住上一次看到的排序键,向后获取下一页:

-- First page:
SELECT * FROM articles
ORDER BY published_at DESC, id DESC
LIMIT 20;

-- Next page — pass the last seen (published_at, id):
SELECT * FROM articles
WHERE (published_at, id) < ($1, $2)
ORDER BY published_at DESC, id DESC
LIMIT 20;

为什么键集分页更快

键集分页使用索引范围扫描:直接跳到上一行之后的位置,读取 N 行即可完成。其代价是 O(页面大小),与分页深度无关。

没有 ORDER BY 的 LIMIT 具有非确定性

经验法则:始终将 LIMIT 与 ORDER BY 配合使用。否则,数据库每次调用都可能返回不同的行。

-- Wrong — results may vary between runs:
SELECT * FROM events LIMIT 10;

-- Right:
SELECT * FROM events ORDER BY id DESC LIMIT 10;

总数统计与分页

界面有时需要知道行的总数。单独执行一个 COUNT(*) 查询是最简单的方式,但对于大表来说可能代价很高:

SELECT COUNT(*) FROM articles WHERE author_id = $1;

-- Alternative for huge tables: estimate from pg_class.reltuples or use approximate counts.

FETCH FIRST(标准 SQL)

标准 SQL 中对应 LIMIT 的语法:

SELECT * FROM products
ORDER BY id
FETCH FIRST 10 ROWS ONLY;

-- With offset:
-- OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY

海量结果集的游标

要导出数百万行时,请使用数据库游标或流式驱动程序,而不是循环执行 LIMIT/OFFSET:

BEGIN;
DECLARE big_cursor CURSOR FOR
  SELECT * FROM events ORDER BY id;
FETCH 1000 FROM big_cursor;
-- ...
CLOSE big_cursor;
COMMIT;

何时可以使用 OFFSET

对于较浅的页面(界面中的第 1–10 页)或小表,OFFSET 没有问题。对于深度分页、无限滚动或 API,请使用键集分页。

回顾

LIMIT 和 OFFSET 用于对结果集进行分页。

  • 始终与 ORDER BY 组合使用
  • OFFSET 在分页较深时会变慢,大页面应切换到键集分页
  • FETCH FIRST 是标准等价语法

快速检查

要深入大型表进行分页,最高效的方式是什么?

常见问题解答

「LIMIT、OFFSET 与分页基础」课时是免费的吗?

是的 — 「LIMIT、OFFSET 与分页基础」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。

「LIMIT、OFFSET 与分页基础」这节课中我会学到什么?

使用 LIMIT 和 OFFSET 为大型结果集分页,理解性能权衡,并使用键集分页实现稳定滚动。 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「LIMIT、OFFSET 与分页基础」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 SQL Academy 课中编写并运行代码吗?

能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 选择列与表达式
  2. WHERE 过滤器:比较与逻辑运算符
  3. 按单列与多列 ORDER BY
  4. LIMIT、OFFSET 与分页基础
← 返回 SQL Academy