MySQL分页首选LIMIT+OFFSET,但需配合ORDER BY;大偏移量时应改用游标分页(如WHERE id>125 ORDER BY id LIMIT 10);总页数宜用COUNT或查11条判下一页,SQL_CALC_FOUND_ROWS已废弃。

MySQL分页查询最常用、最直接的方式是用 LIMIT 和 OFFSET,但实际使用中要注意性能和逻辑细节。
基础分页:LIMIT + OFFSET
语法格式为:LIMIT offset, row_count 或 LIMIT row_count OFFSET offset。比如查第2页(每页10条):
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 10;- 等价写法:
SELECT * FROM users ORDER BY id LIMIT 10, 10;
注意:OFFSET从0开始,第1页是OFFSET 0,第2页是OFFSET 10,以此类推。务必配合 ORDER BY 使用,否则结果顺序不固定,分页会错乱。
优化大偏移量分页(避免慢查询)
当页码很大(如第10000页),OFFSET 100000 会导致MySQL扫描前10万行再丢弃,效率极低。推荐用“游标分页”(基于上一页最后一条记录的主键值):
- 第1页:
SELECT * FROM users ORDER BY id LIMIT 10; - 第2页(假设第1页最后id=125):
SELECT * FROM users WHERE id > 125 ORDER BY id LIMIT 10;
这种方式不依赖OFFSET,只走索引范围扫描,速度稳定。适用于按主键或有唯一有序字段(如时间戳)分页的场景。
计算总页数与边界处理
SELECT COUNT(*) FROM users WHERE status = 1;-
后端根据每页条数算出总页数:
ceil(total / page_size)
更稳妥的做法是只查下一页是否存在(例如查11条,显示前10条,若第11条存在则说明还有下一页),避免COUNT全表扫描。
使用SQL_CALC_FOUND_ROWS已废弃,别再用
旧版本MySQL支持SQL_CALC_FOUND_ROWS配合FOUND_ROWS(),但自8.0.17起已被移除,且本身性能也不佳。现在统一推荐用独立COUNT语句或游标逻辑替代。










