3

我在 MySQL 中有一个数据集,其中使用 limit 已经是一个昂贵的查询,并且查找结果的数量也很昂贵。因此,我想避免进行另一个查询来查找结果数。我不能使用 MYSQL_CALC_FOUND_ROWS 因为限制在子查询中:

SELECT * FROM items,
(
  SELECT
    item_id
  FROM
    (etc)
  WHERE
    some.field=<parameter>
  AND (etc)
  GROUP BY (something)
  ORDER BY (something_else) DESC
  LIMIT 15
) subset
WHERE item.id=subset.item_id

我可以留下连接项并取消子查询,然后可以使用 MYSQL_CALC_FOUND_ROWS,但这非常非常慢。我已经尝试了所有索引优化,让我们假设它是不可能的。

现在这更像是一个设计问题......当我不知道最后一页时,如何允许用户翻阅这些数据?我只知道他们是否走得太远(例如:查询不返回任何结果)。

4

2 回答 2

6

以下是 MySQL 大师 Baron Schwartz 的一篇文章的摘要:

http://www.mysqlperformanceblog.com/2008/09/24/four-ways-to-optimize-paginated-displays/

优化分页显示的四种方法

  1. 在第一个查询中,获取并缓存所有结果。

  2. 不要显示所有结果。甚至谷歌也没有让你看到百万分之一的结果。

  3. 不要显示总数或到其他页面的中间链接。仅显示“下一个”链接。

  4. 估计有多少结果。同样,谷歌这样做了,没有人抱怨。

于 2008-12-07T06:00:48.683 回答
0

为了强调这一点,“多少”的概念无论如何都是非常短暂的。当答案到达用户手中时,它很容易出错。

于 2008-12-07T06:40:48.320 回答