我在MySQL中有一个数据集,其中使用限制已经是一个昂贵的查询,找到结果的数量也很昂贵。因此,我想避免做另一个查询来查找结果的数量。我不能使用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,但这非常非常慢。我已经尝试了所有索引优化,让我们假设它是不可能的。
这现在变得更像是一个设计问题...... 当我不知道最后一页时,如何允许用户翻阅这些数据?我只知道他们是否走得太远(例如:查询没有返回结果)。
答案 0 :(得分:6)
以下是MySQL大师Baron Schwartz撰写的文章摘要:
http://www.mysqlperformanceblog.com/2008/09/24/four-ways-to-optimize-paginated-displays/
在第一个查询中,获取并缓存所有结果。
不显示所有结果。甚至谷歌也不会让你看到百万分之一的结果。
不显示总计数或其他页面的中间链接。仅显示“下一个”链接。
估算有多少结果。再一次,谷歌这样做,没有人抱怨。
答案 1 :(得分:0)
为了强调这一点,“多少”的概念无论如何都是非常短暂的;当答案传达给用户时,很容易出错。