推荐用 page + size,后端转为 offset + limit;可校验边界防越界,避免前端传过大 offset 导致全表扫描;大数据量时应改用游标分页(如 WHERE created_at
分页参数该用
page+size还是offset+limit?推荐在 API 层统一用
page和size,后端转换为offset和limit再传给数据库。这样对前端更友好,也便于做默认值和边界校验。常见错误是直接把
offset暴露给前端:用户可能传offset=9999999导致全表扫描或超时;而page=1000&size=20更容易做上限拦截(比如限制page )。
page从 1 开始(不是 0),避免前端混淆size应设硬性上限(如最大 100),防止恶意拉取大量数据- 若业务需精确跳转(如“加载更多”无限滚动),可额外支持
cursor模式,但不要替代page/sizeGo 后端如何安全解析并校验分页参数
别用
strconv.Atoi直接转,要结合net/http的ParseForm和自定义校验逻辑。重点防空值、负数、超限、非数字。func parsePagination(r *http.Request) (page, size int, err error) { r.ParseForm() page, err = strconv.Atoi(r.FormValue("page")) if err != nil || page < 1 { return 0, 0, fmt.Errorf("invalid page: must be >= 1") } size, err = strconv.Atoi(r.FormValue("size")) if err != nil || size < 1 || size > 100 { return 0, 0, fmt.Errorf("invalid size: must be between 1 and 100") } return page, size, nil }注意:
r.FormValue对重复 key 只取第一个,如果需要支持多值(如page[]=1&page[]=2),得用r.Form["page"]并手动处理。立即学习“go语言免费学习笔记(深入)”;
数据库查询时 offset 性能问题怎么绕开
MySQL / PostgreSQL 中
OFFSET越大越慢,尤其在千万级表上。当page > 1000或offset > 10000时,必须考虑优化。
- 用主键/时间戳做游标分页(
WHERE created_at )- 加覆盖索引,确保
ORDER BY和WHERE字段都在索引中- 对管理后台类场景,可缓存总条数和高频页的
offset映射(如预计算 page 500 → offset 9980)不要依赖
SELECT COUNT(*)实时算总数——高并发下它会成瓶颈。改用近似值(如 MySQL 的EXPLAIN行数)或异步更新的统计表。返回分页元信息时字段命名要一致且带单位
前端最怕字段名来回变:
total、totalCount、total_items混用。建议固定为:
total:总记录数(int)page:当前页码(从 1 开始)size:每页条数pages:总页数((total + size - 1) / size)has_next/has_prev:布尔值,比算page 更直观示例响应结构(JSON):
{ "data": [...], "pagination": { "total": 1247, "page": 3, "size": 20, "pages": 63, "has_next": true, "has_prev": true } }游标分页则不用
pages和page,改用next_cursor和prev_cursor字符串,且不返回total—— 这点很容易被忽略,但必须明确告知前端。
0
0
相关文章
如何使用Golang安装数据库驱动_支持MySQL和PostgreSQL
如何在 Go 中使用 GORP 将 MySQL 查询结果正确序列化为 JSON
如何在 Go 中使用 GORP 将数据库查询结果正确序列化为 JSON
Golang如何配置数据库连接环境_GoDB驱动安装与配置
Go App Engine部署中第三方包导入失败的解决方案
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门AI工具
相关专题
golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
178
2024.02.23
golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
226
2024.02.23
golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
337
2024.02.23
golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
208
2024.03.05
golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
391
2024.05.21
本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。
2
2026.01.16
热门下载
相关下载
精品课程
最新文章




