使分页与其计数一起工作

Making pagination work with its count

我有一个关于如何在以 mysql 作为数据库的服务器端进行分页的问题。我已经弄清楚了其中的大部分,并且工作得很好,但我在想有没有办法消除计数查询。假设用户搜索单词 jack,结果计数为 25,每页 10 个分页。我的分页器需要知道所有行的数量才能在分页器中显示正确的数量。所以我现在这样做的方式是首先我使用这样的 sql 查询来计算符合该条件的所有行的数量:

"SELECT COUNT(id) AS count FROM " + table + query

然后我像这样对数据库进行另一个查询,使用 LIMIT 和 OFFSET 选项来获得准确的页面:

"SELECT * FROM " + table + query + " LIMIT ? OFFSET ?"

然后我return两个对象给客户端。首先是所有行的计数和用户现在需要查看的行的秒数。我的问题是这是最有效的方法还是有更好的方法?

我没有发现您的方法有任何问题(尽管您可以一次性将查询发送到数据库)。传统的数据库分页方式,你必须知道总记录数,所以这就是如何得到计数。

改进主要是以不同的方式进行。

改进1:无限滚动,这就是分页功能。可能不是你想要的,但我们看到越来越多的网站采用这种方式。用户真的需要知道自由文本搜索有多少页吗?

改进2:使用ElasticSearch,而不是数据库。它是为自由文本搜索而构建的,肯定会比数据库表现更好。您还可以获得一次搜索请求中的计数(点击次数)和页数。

您可以通过一个查询实现这一点,但它会对输出数据造成负担,例如,如果您限制 1000 条记录,那么 total_records 将在结果集中的所有行中显示该数字 1000 次。但同时会减少1次查询:

SELECT 
  column1,
  column2,
  column3,
  (SELECT COUNT(id) FROM `table`) AS total_records 
FROM
  `table` 
LIMIT 0, 10