Relay 风格分页深层优化:连接类型与游标编码
从底层实现高效的游标分页,覆盖数据库索引设计、游标序列化以及增量加载。 · 难度:入门 · +10XP
Relay 风格分页深层优化:连接类型与游标编码
本教程不仅教授如何使用 connection 类型,还深入游标的生成策略:基于时间戳、UUID 或 base64 编码的排序键。我们实现一个可复用 paginate 函数,利用数据库游标(如 SQL 的 WHERE + LIMIT)代替 OFFSET,避免大偏移量性能问题。同时,讨论如何利用 hasNextPage 与 totalCount 的预计算缓存,以及如何在前端使用 @connection 指令合并缓存。
function paginate(query, { first, after }) {
const cursor = after ? decodeCursor(after) : null;
return query
.where(cursor ? { id: { $gt: cursor } } : {})
.limit(first + 1)
.then(rows => ({
edges: rows.slice(0, first).map(row => ({
node: row,
cursor: encodeCursor(row.id)
})),
pageInfo: {
hasNextPage: rows.length > first
}
}));
}