在mysql中进行分页查询,核心是通过LIMIT子句限制返回的记录数量,结合OFFSET指定查询的起始位置,从而获取指定页的数据。分页查询可以有效减少单次查询返回的数据量,提升查询效率和页面加载速度,是数据库查询中非常实用的功能。

mysql分页查询基础语法
mysql中最基础的分页查询语法是使用LIMIT关键字,基本格式如下:
-- 基础分页语法,offset是起始偏移量,从0开始计数,page_size是每页显示的记录数 SELECT 列名 FROM 表名 LIMIT offset, page_size; -- 也可以使用LIMIT page_size OFFSET offset的写法,语义更清晰 SELECT 列名 FROM 表名 LIMIT page_size OFFSET offset;
假设我们有一张用户表user,包含id、username、age三个字段,现在要查询第一页数据,每页显示10条,对应的查询语句如下:
-- 查询第一页,偏移量为0,每页10条 SELECT id, username, age FROM user LIMIT 0, 10; -- 等价于下面的写法 SELECT id, username, age FROM user LIMIT 10 OFFSET 0;
如果要查询第二页数据,只需要把偏移量设置为10即可,因为前两页总共是20条数据,第二页的起始位置是第11条,偏移量为10:
-- 查询第二页,偏移量为10,每页10条 SELECT id, username, age FROM user LIMIT 10, 10; -- 等价于下面的写法 SELECT id, username, age FROM user LIMIT 10 OFFSET 10;
分页查询的通用公式
在实际开发中,分页查询通常会接收前端传递的当前页码current_page和每页大小page_size参数,我们可以通过公式计算出对应的偏移量:
offset = (current_page - 1) * page_size
比如当前页码是3,每页大小是15,那么偏移量就是(3-1)*15=30,对应的查询语句为:
-- 计算偏移量后执行分页查询 SET @current_page = 3; SET @page_size = 15; SET @offset = (@current_page - 1) * @page_size; SELECT id, username, age FROM user LIMIT @offset, @page_size;
深度分页的性能问题
当查询的页码非常大时,比如查询第1000页,每页10条,此时偏移量是(1000-1)*10=9990,mysql需要扫描前9990条记录,然后返回后面的10条,扫描的记录数越多,查询性能就越差,这就是深度分页问题。
我们可以通过EXPLAIN关键字查看查询的执行计划,对比浅分页和深度分页的性能差异:
-- 查看浅分页的执行计划 EXPLAIN SELECT id, username, age FROM user LIMIT 0, 10; -- 查看深度分页的执行计划 EXPLAIN SELECT id, username, age FROM user LIMIT 9990, 10;
执行后会发现深度分页的rows字段值远大于浅分页,说明扫描的行数更多,耗时更长。
深度分页优化方案
1. 基于自增主键优化
如果表的id是自增主键,且查询没有复杂的排序条件,可以利用主键索引优化深度分页,先找到上一页的最大id,然后查询id大于该值的数据:
-- 假设上一页的最大id是9990,查询下一页数据 SELECT id, username, age FROM user WHERE id > 9990 LIMIT 10;
这种方式不需要扫描前面的记录,直接通过主键索引定位到起始位置,性能会提升很多。
2. 使用覆盖索引优化
如果查询的字段都包含在索引中,mysql可以使用覆盖索引直接返回数据,不需要回表查询,也能提升分页性能。比如给username和age建立联合索引:
-- 建立联合索引 CREATE INDEX idx_username_age ON user(username, age); -- 查询字段都在索引中,使用覆盖索引优化 SELECT username, age FROM user LIMIT 9990, 10;
分页查询注意事项
- 如果查询有排序需求,一定要给排序字段加索引,否则mysql会进行全表排序,分页性能会很差。
- 不要使用
SELECT *进行分页查询,只查询需要的字段,减少数据传输量和回表操作。 - 如果数据量非常大,且分页需求是跳页查询,建议和产品沟通调整为只能上下翻页,避免深度分页问题。
分页查询是mysql的常用功能,基础用法简单,但性能优化需要根据实际场景选择合适的方案,合理设计索引和查询逻辑才能保障查询效率。