mysql分页核心是limit和offset,但offset越大性能越差;优化方案是游标分页,利用上一页末条记录的排序字段值(如created_at、id)加where条件实现高效分页。

MySQL 分页列表的核心是用 LIMIT 和 OFFSET 控制返回的数据范围,但要注意性能陷阱和实际业务中的常见写法。
基础分页:LIMIT + OFFSET 最常用写法
假设每页显示 10 条,当前是第 3 页(即跳过前 20 条):
SELECT * FROM articles ORDER BY id DESC LIMIT 10 OFFSET 20;等价写法(更简洁):
SELECT * FROM articles ORDER BY id DESC LIMIT 20, 10;注意:OFFSET 越大,查询越慢,因为 MySQL 仍需扫描并跳过前面所有行。千万级数据下,第 10000 页可能明显卡顿。
优化分页:用“游标分页”替代 OFFSET
适合按时间或 ID 有序的场景(如新闻列表、订单流),避免深度偏移。核心思路是记住上一页最后一条记录的排序字段值:
功能简介:1.用户留言功能2.用户定货功能3.定制货货功能4.定制网页样式和其实设置(比如主页)5.强大的管理功能(现在的程序都是管理功能大于应用功能:)6.管理功能支持查看订货单,留言,分页,删除等功能管理页面:login.asp管理密码:admin
- 第一页查:SELECT * FROM orders ORDER BY created_at DESC, id DESC LIMIT 10;
- 第二页查(假设上一页最后一条 created_at='2024-05-01 10:20:30',id=12345):
SELECT * FROM orders WHERE created_at
这种写法能走索引,响应稳定,适合无限滚动或下拉加载。
后端配合:计算总页数与边界处理
前端常需显示“共 XX 条,第 X 页/共 Y 页”。可分两步:
- 查总数(轻量 COUNT):SELECT COUNT(*) FROM articles WHERE status = 1;
- 查数据(带分页):SELECT id, title, updated_at FROM articles WHERE status = 1 ORDER BY updated_at DESC LIMIT ?, ?;
注意:不要用 COUNT(*) 加复杂 WHERE 和 JOIN 做高频分页总数统计——可考虑缓存总数,或改用估算(如 SHOW TABLE STATUS 中的 Rows 近似值)。
真实项目小技巧
实际开发中建议:
- 默认按主键或时间字段排序,确保结果稳定(避免无 ORDER BY 导致分页错乱);
- 对搜索类分页,WHERE 条件务必建联合索引(如 (status, updated_at));
- 前端传参校验页码和每页条数,防止恶意传入极大 offset(如 page=999999);
- 接口返回结构包含 data、total、page、page_size,方便前端统一渲染。









