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

发布: (2026年1月13日 GMT+8 13:18)
4 min read
原文: Dev.to

Source: Dev.to

封面图片:🐌 “我的 Spring Boot API 变慢了… 直到我学会了分页与排序”

为什么排序和分页很重要

在真实的应用中:

  • 数据库增长迅速
  • 一次性获取全部数据代价高昂
  • 客户端很少需要 全部 数据

排序和分页可以帮助你:

  • 提升性能
  • 降低内存使用
  • 提供更快的 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 与真实后端开发的分享。

Back to Blog

相关文章

阅读更多 »

我直到构建持久层才明白 JPA

封面图片 👉“I Didn’t Understand JPA Until I Built the Persistence Layer” https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto...

数据库事务泄漏

介绍 我们经常谈论 memory leaks,但在 backend development 中还有另一个沉默的性能杀手:Database Transaction Leaks。我最近…

Gin vs Spring Boot:详细比较

封面图片:Gin vs Spring Boot:详细比较 https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%...