在mysql数据库的实际使用中,分页查询是非常常见的需求,比如列表页展示数据时需要每次只返回固定条数的记录,避免一次性返回过多数据导致性能问题。limit就是mysql提供的专门用于限制查询结果返回条数的语法,通过它可以很方便地实现分页功能。

limit分页的基础语法
limit分页的基本语法结构有两种形式,第一种是只指定返回的记录数:
-- 只返回前10条记录,不指定偏移量 SELECT * FROM user_table LIMIT 10;
第二种是同时指定偏移量和返回记录数,这也是分页最常用的形式,语法如下:
-- 语法格式:LIMIT 偏移量, 返回记录数 SELECT * FROM 表名 LIMIT offset, page_size;
这里的offset表示跳过前面的多少条记录,page_size表示本次查询要返回的记录条数。比如要查询第1页数据,每页10条,就跳过0条,返回10条,对应的sql如下:
-- 查询第1页,每页10条 SELECT * FROM user_table LIMIT 0, 10;
如果要查询第2页,每页还是10条,就需要跳过前10条,对应的sql为:
-- 查询第2页,每页10条 SELECT * FROM user_table LIMIT 10, 10;
分页参数的通用计算方式
在实际开发中,我们通常会得到当前页码current_page和每页大小page_size,这时候需要先计算偏移量offset,计算公式是:
// Java中计算偏移量的示例 int offset = (currentPage - 1) * pageSize;
对应的mysql语句就可以动态拼接为:
-- 假设current_page=3,page_size=10,计算后offset=20 SELECT * FROM user_table LIMIT 20, 10;
limit分页的另一种写法
除了LIMIT offset, page_size的写法,mysql还支持LIMIT page_size OFFSET offset的写法,两种写法效果完全一致,只是语法顺序不同,开发者可以根据自己的习惯选择:
-- 两种写法等价,都是查询第3页每页10条 SELECT * FROM user_table LIMIT 20, 10; SELECT * FROM user_table LIMIT 10 OFFSET 20;
limit分页的注意事项
偏移量从0开始
mysql的limit偏移量是从0开始计数的,也就是说跳过0条就是返回第1条记录,很多新手会误以为偏移量从1开始,导致分页结果错误。
大偏移量的性能问题
当offset非常大的时候,比如LIMIT 100000, 10,mysql需要扫描前100010条记录,然后丢弃前100000条,只返回后面的10条,这时候查询性能会明显下降。如果要优化大偏移量的分页,可以结合索引使用,比如先查询到当前页第一条记录的主键id,然后通过id过滤后再limit:
-- 优化大偏移量分页,假设id是主键且有索引 SELECT * FROM user_table WHERE id > (SELECT id FROM user_table LIMIT 100000, 1) LIMIT 10;
排序对分页的影响
如果分页查询需要排序,一定要加上ORDER BY子句,否则mysql返回的记录顺序是不确定的,可能导致分页结果重复或者遗漏。排序字段最好有索引,这样能提升排序和分页的效率:
-- 按创建时间倒序分页,每页10条,查询第2页 SELECT * FROM user_table ORDER BY create_time DESC LIMIT 10, 10;
实际开发中的完整分页示例
下面是一个完整的带排序、带条件过滤的分页查询示例,查询状态为1的用户,按注册时间倒序,每页15条,查询第4页:
-- 完整分页查询示例 SELECT id, username, email, create_time FROM user_table WHERE status = 1 ORDER BY create_time DESC LIMIT 45, 15;
这个查询首先过滤出状态为1的用户,然后按注册时间倒序排序,跳过前45条记录,返回接下来的15条,正好是第4页的内容。