跳到主要内容
版本:Nightly

OFFSET

OFFSET 子句指定在开始从查询返回行之前要跳过的行数。它通常与 LIMIT 结合使用,用于对大型结果集进行分页。

例如:

SELECT *
FROM system_metrics
ORDER BY cpu_util DESC
LIMIT 10
OFFSET 10;

它从 system_metrics 表中选择按降序 cpu_util 排序的第 11 到 20 行的所有列。

虽然将 OFFSETLIMITORDER BY 子句结合使用可以实现分页,但这种方法效率不高。我们建议记录每页返回的最后一条记录的时间索引(时间戳),并使用该值来过滤和限制后续页面的数据。这种方法提供了更好的分页性能。

使用时间戳的高效分页

假设您的 system_metrics 表有一个作为时间索引(时间戳)的 ts 列。您可以使用上一页最后一条记录的时间戳来高效地获取下一页。

第一页(最新的 10 条记录):

SELECT *
FROM system_metrics
ORDER BY ts DESC
LIMIT 10;

第二页(使用上一页的最后一个时间戳),如果第一页的最后一条记录的 ts 值为 '2024-07-01 16:03:00',您可以这样获取下一页:

SELECT *
FROM system_metrics
WHERE ts < '2024-07-01 16:03:00'
ORDER BY ts DESC
LIMIT 10;

每次查询后,记录最后一行的 ts 值并将其用于下一个查询的过滤器。 这种方法消除了扫描和跳过行(如使用 OFFSET)的需要,从而使分页效率更高,尤其是在大型表中。