Mysql分页

一、定义

分页(Pagination)
是指在数据库查询中,将大量的结果集按照固定的数量分割成多个部分(页),以便逐步查看和处理。
分页可以提高数据查询和传输的效率,减少一次性加载大量数据带来的性能问题。

二、应用

分页在数据库操作中有广泛的应用,主要包括:

  • 数据展示:当需要展示大量数据时,分页可以避免一次性加载所有数据,提高页面加载速度和用户体验。
  • 数据处理:在批量处理数据时,分页可以将大任务拆分为小任务,降低系统压力。
  • 日志查询:对于日志或审计等大量记录的查询,分页有助于快速定位和查看特定范围的数据。

三、核心概念

  1. LIMIT 子句

    LIMIT 是 MySQL 提供的用于限制查询结果数量的子句,常用于实现分页。其基本语法为:

    SELECT * FROM 表名 LIMIT 行数;
    
  2. OFFSET 子句

    OFFSET 用于指定查询结果的起始位置,配合 LIMIT 使用,实现从特定位置开始获取指定数量的记录。完整语法为:

    SELECT * FROM 表名 LIMIT 偏移量, 行数;
    

    或者使用标准 SQL 语法:

    SELECT * FROM 表名 LIMIT 行数 OFFSET 偏移量;
    
  3. 计算偏移量

    偏移量的计算公式:

    OFFSET = (当前页数 - 1) * 每页记录数
    

四、查询的 SQL 样例

假设我们有一个名为 users 的表,包含 100 条记录,结构如下:

id name email
1 用户1 user1@example.com
2 用户2 user2@example.com
... ... ...
100 用户100 user100@example.com

我们希望以每页 15 条记录的方式查看数据,以下是分页查询的示例:

1. 查询第 1 页的数据

计算偏移量:

OFFSET = (1 - 1) * 15 = 0

SQL 查询:

SELECT id, name, email FROM users
ORDER BY id ASC
LIMIT 15 OFFSET 0;

或等效地:(这种用得)

SELECT id, name, email FROM users
ORDER BY id ASC
LIMIT 0, 15;

2. 查询第 2 页的数据

计算偏移量:

OFFSET = (2 - 1) * 15 = 15

SQL 查询:

SELECT id, name, email FROM users
ORDER BY id ASC
LIMIT 15 OFFSET 15;

3. 查询第 3 页的数据

计算偏移量:

OFFSET = (3 - 1) * 15 = 30

SQL 查询:

SELECT id, name, email FROM users
ORDER BY id ASC
LIMIT 15 OFFSET 30;

4. 使用变量动态分页

可以使用 MySQL 变量来动态设置分页参数:

SET @pageSize = 15;
SET @pageNumber = 2; -- 查询第 2 页

SET @offset = (@pageNumber - 1) * @pageSize;

SELECT id, name, email FROM users
ORDER BY id ASC
LIMIT @pageSize OFFSET @offset;

五. 目前limit使用(目前主流)。

MySQL 分页:只使用 LIMIT 实现分页效果的示例

在 MySQL 中,实现分页通常使用 LIMIT 子句。LIMIT 可以接受一个或两个参数,通过指定返回记录的数量和起始位置来实现分页效果。本文将重点介绍如何只使用 LIMIT,不使用 OFFSET,来完成分页查询。

分页核心概念(只使用 LIMIT)

使用 LIMIT 的两种形式:

  1. LIMIT 行数 --获取指定条数的数据

    SELECT * FROM 表名
    LIMIT 行数;
    
    • 返回结果集的前 行数 条记录。
例子: select * from user order by create_time desc limit 5;
查询用户表最新创建的5条记录
  1. LIMIT 起始位置, 行数 --分页

    SELECT * FROM 表名
    LIMIT 起始位置, 行数;
    
    
    • 从结果集的第 起始位置 条记录开始,返回接下来的 行数 条记录。
    • 注意起始位置0 开始计数。

计算起始位置:

起始位置 = (当前页数 - 1) * 每页记录数

查询的 SQL 样例(只使用 LIMIT)

假设我们有一个包含 100 条记录的 users 表,结构如下:

id name email
1 用户1 user1@example.com
2 用户2 user2@example.com
... ... ...
100 用户100 user100@example.com

我们希望以每页 15 条记录的方式查看数据,以下是使用仅使用 LIMIT 的分页查询示例:

1. 查询第 1 页的数据

计算起始位置:

起始位置 = (1 - 1) * 15 = 0

SQL 查询:

SELECT id, name, email FROM users
ORDER BY id ASC
LIMIT 0, 15;
  • 解释:从第 0 条记录开始,取 15 条记录,即第 1 至第 15 条记录。

2. 查询第 2 页的数据

计算起始位置:

起始位置 = (2 - 1) * 15 = 15

SQL 查询:

SELECT id, name, email FROM users
ORDER BY id ASC
LIMIT 15, 15;
  • 解释:从第 15 条记录开始,取 15 条记录,即第 16 至第 30 条记录。

3. 查询第 3 页的数据

计算起始位置:

起始位置 = (3 - 1) * 15 = 30

SQL 查询:

SELECT id, name, email FROM users
ORDER BY id ASC
LIMIT 30, 15;
  • 解释:从第 30 条记录开始,取 15 条记录,即第 31 至第 45 条记录。

4. 使用变量动态分页

SET @pageSize = 15;
SET @pageNumber = 2; -- 查询第 2 页

SET @start = (@pageNumber - 1) * @pageSize;

SELECT id, name, email FROM users
ORDER BY id ASC
LIMIT @start, @pageSize;
  • 解释:动态计算起始位置,方便分页参数的调整。

注意事项

  1. LIMIT 参数顺序

    • 当使用两个参数时,第一个参数是起始位置(偏移量),第二个参数是返回的行数。

    • 起始位置从 0 开始计数,即第 1 条记录的起始位置是 0。

      SELECT id, name, email FROM user limit 0,10;--是第1到第10条记录
      SELECT id, name, email FROM user limit 1,10;--是第2到第11条记录
      
  2. 性能考虑

    • 对于大数据量和高起始位置的分页查询,性能可能会下降。可以考虑基于索引的分页方式,避免高偏移量。

    • 示例(基于 ID 的分页):

      SELECT id, name, email FROM users
      WHERE id > 上一页最后一条记录的 id
      ORDER BY id ASC
      LIMIT 15;
      
  3. 排序的重要性

    • 使用 ORDER BY 确保数据顺序一致,特别是在分页查询中,否则每次查询的结果可能不一致。
  4. 数据一致性

    • 在数据频繁变化的表中,分页结果可能会受到插入或删除操作的影响,需要考虑数据的一致性和可靠性。

六、总结

通过只使用 LIMIT 子句,可以实现分页功能,而无需使用 OFFSET。理解 LIMIT 的两个参数含义(起始位置和返回行数),并正确计算起始位置,是实现分页查询的关键。在实际应用中,应结合数据量和具体需求,选择合适的分页方式,并注意性能和数据一致性问题。


参考资料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容