如何在mysql中实现分页查询_mysql分页查询实战方法

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

MySQL分页查询最常用、最直接的方式是用 LIMITOFFSET,但实际使用中要注意性能和逻辑细节。

基础分页:LIMIT + OFFSET

语法格式为:LIMIT offset, row_countLIMIT 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,只走索引范围扫描,速度稳定。适用于按主键或有唯一有序字段(如时间戳)分页的场景。

计算总页数与边界处理

前端常需显示“共XX页”,可先查总数(但大数据量慎用):

  • 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语句或游标逻辑替代。