如果我们按LIMIT m, n
使用传统方法,我们可能会采取以下步骤:
SELECT COUNT(*) FROM table WHERE condition
获取总数并计算页数;
SELECT columns FROM table WHERE condition LIMIT 0, 100
显示第一页(假设每页100行);
SELECT columns FROM table WHERE condition LIMIT 100, 100
;
...
这可能非常昂贵,因为WHERE condition
可能是全表扫描。如果缓存关闭,MySQL可能会在每个页面上缓慢执行此操作。
所以我有另一种方法来实现这个分页查询:
SELECT id FROM table WHERE condition
获取符合我条件的所有ID。如果此表中有大量数据(例如1,000,000多行),我们可以限制结果大小(例如,最多10,000个,LIMIT 10000
)。这些ID被发送到前端(通过动态页面或Ajax,JavaScript代码或JSON数据);
在前端,JavaScript选择前100个ID作为第一页,然后请求这些行,因此我们在后端有SELECT columns FROM table WHERE id IN (id_0, id_1, ..., id_99)
;
点击“下一页”时我们SELECT columns FROM table WHERE id IN (id_100, id_101, ..., id_199)
;
...
在这种方法中,我们只有一个WHERE condition
,并且主键查询会查询完整数据。
这是在我的兼职项目中实现的:(http://)www.chess-wizard.com/base/(首页数据存储在JSP for SEO中)。
我将这个想法分享给我的团队成员,但他们不同意我的意见: - (
为什么LIMIT m,n
必须是标准 / 唯一方式来实现分页查询?