键集分页:高效数据库分页的 OFFSET 的高级替代方案
处理大型数据集通常需要高效的分页。 虽然 OFFSET 是一种常见方法,但它存在性能限制。本文强调键集分页是一种更高效、更强大的解决方案。
为什么键集分页胜过 OFFSET
基于 OFFSET 的分页(行集分页)需要读取所需页面之前的所有行。 然而,键集分页使用索引直接访问目标行,绕过不必要的数据检索。 这种优化显着提高了性能并消除了 OFFSET 中固有的“缺失行”问题。 键集分页依靠不变的键来保证数据的一致性。
实际实施
让我们用一个由“Id”索引的“TableName”表来说明。要获取初始记录集:
<code class="language-sql">SELECT TOP (@numRows) * FROM TableName ORDER BY Id DESC;</code>
使用上一个查询中的最后一个“Id”值检索后续页面:
<code class="language-sql">SELECT TOP (@numRows) * FROM TableName WHERE Id < @lastId ORDER BY Id DESC;</code>
注意索引的有效使用。
重要注意事项
有效的键集分页需要唯一的索引。 如果您的分页依赖于非唯一列,请在 ORDER BY
和 WHERE
子句中包含其他列以确保唯一性。
SQL Server 的限制需要稍微复杂的查询:
<code class="language-sql">SELECT TOP (@numRows) * FROM TableName WHERE ((OtherColumn = @lastOther AND Id < @lastId) OR OtherColumn < @lastOther) ORDER BY OtherColumn DESC, Id DESC;</code>
处理 NULL 值需要仔细注意,并且可能需要单独的查询。
总结
键集分页比 OFFSET 具有显着的性能优势。通过利用索引,它可以避免处理不必要的数据,即使对于非常大的数据集也能实现高效的分页。 通过适当的规划和考虑边缘情况,键集分页为导航大量数据存储提供了可靠且高性能的解决方案。
以上是为什么数据库分页的键集分页比 OFFSET 更有效?的详细内容。更多信息请关注PHP中文网其他相关文章!