🐌 “我的 Spring Boot API 变慢了… 直到我学会了分页与排序”
Source: Dev.to

为什么排序和分页很重要
在真实的应用中:
- 数据库增长迅速
- 一次性获取全部数据代价高昂
- 客户端很少需要 全部 数据
排序和分页可以帮助你:
- 提升性能
- 降低内存使用
- 提供更快的 API 响应
- 构建可扩展的系统
这在生产环境的后端中 不是可选的。
使用方法名进行排序
Spring Data JPA 允许在方法名中直接写入排序。
List findAllByOrderByNameAsc();
List findAllByOrderByNameDesc();
这种方式适用于:
- 排序逻辑固定
- 需求简单
但在真实项目中往往需要 动态排序。
使用 Sort 类进行动态排序
在仓库方法中使用排序
List findByDepartment(String department, Sort sort);
这样可以让客户端决定:
- 按哪个字段排序
- 升序还是降序
创建 Sort 对象
Sort sort = Sort.by(Sort.Direction.ASC, sortField);
多个排序字段:
Sort sort = Sort.by(
Sort.Order.asc("name"),
Sort.Order.desc("salary")
);
为什么仅有排序仍然不够
即使有了排序:
- 返回成千上万行数据仍然低效
- API 变慢
- 客户端难以处理大响应
这时 分页 就显得尤为重要。
理解分页
关键分页概念
Page
表示单个数据块,同时包含:
- 总元素数
- 总页数
- 当前页的数据
Pageable
定义:
- 页码
- 每页大小
- 排序规则
PageRequest
Pageable 的具体实现,用于创建分页对象。
在仓库中使用 Pageable
Spring Data JPA 让分页变得极其简单。
Page findAll(Pageable pageable);
Page findByLastName(String lastName, Pageable pageable);
无需写 SQL,也不需要复杂逻辑。只需干净的接口签名。
创建 Pageable 实例
Pageable pageable = PageRequest.of(
pageNumber,
size,
Sort.by("lastName").ascending()
);
通过它你可以控制:
- 每页大小
- 页码
- 排序
所有这些都封装在一个对象中。
我曾经犯的错误
我过去的做法是:
- 把所有记录全部查询出来
- 在内存中进行排序
- 忽视可扩展性
这种方式在数据量小的时候还能工作……但数据一增多就崩溃了。使用分页和排序后:
- API 变得更快
- 内存占用下降
- 后端感觉已经可以投入生产
结语
排序和分页并不是“额外功能”。它们是 后端核心基础。如果你的 Spring Boot API 感觉:
- 迟缓
- 负担沉重
- 难以扩展
从这里开始吧。
本文是我在 公开学习(learning‑in‑public)过程中,探索 Spring Boot 与真实后端开发的分享。