基于游标的分页中的页码和总结果数

Page numbers & total result count in a cursor based pagination

虽然这听起来像是一个愚蠢的问题,但有时需要显示页码(以及最后一页)。在基于游标的分页中计算总行数以及计算页码(通过向 return 特定页面提供页面查询)的最佳方法是什么?也可以在单个查询中实现所有这些吗?

常见示例:Google 使用基于游标的分页显示 google 搜索中的页码以及行数。

请注意 Google 显示最后页码。

它们显示 1 - 10Next

在顶部,他们确实显示了总结果的估计值,例如:

About 1,730,000,000 results (0.94 seconds)

但这并没有使用SQL。这是使用 Google's proprietary distributed search technology.

为了回答您的问题,MySQL 有一个名为 SQL_CALC_FOUND_ROWS 的功能,您可以将其用作带有 LIMIT 的 SELECT 查询的查询修饰符。然后查询值 FOUND_ROWS() 以了解如果您没有使用 LIMIT 将有多少行 returned。

SELECT SQL_CALC_FOUND_ROWS ... FROM Mytable WHERE ... LIMIT 10;

SELECT FOUND_ROWS();

但是,https://dev.mysql.com/doc/refman/8.0/en/information-functions.html#function_found-rows 表示此功能已弃用。事实证明它效率不高,实际上最好进行两次查询,一次查询行数,然后第二次查询 return 结果为 LIMIT。

SELECT COUNT(*) FROM Mytable WHERE ...;

SELECT ... FROM Mytable WHERE ... LIMIT 10;

此博客中显示了性能测量值:https://www.percona.com/blog/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/