讲师中心 微信公众号
AI工具推荐 视频效率加速

ThinkPHP怎么处理大表分页性能_ThinkPHP游标分页替代方案【说明】

落墨同学_3275

落墨同学_3275

发布时间:2026-05-06 06:08:59

|

227人浏览过

|

来源于php中文网

原创

ThinkPHP 的 paginate() 分页变慢是因为其基于 OFFSET + LIMIT,大数据量时 MySQL 需扫描大量行,导致 Using filesort 或 Using temporary;应改用游标分页,如 WHERE id > ? ORDER BY id LIMIT N,并确保排序字段有唯一索引。

thinkphp怎么处理大表分页性能_thinkphp游标分页替代方案【说明】

ThinkPHP 用 paginate() 查大表为什么越来越慢

因为 paginate() 默认基于 OFFSET + LIMIT,数据量一过百万,OFFSET 50000 这类查询就得全表扫到第 5 万行,MySQL 执行计划里常看到 Using filesortUsing temporary,CPU 和 I/O 都在飙。

真实场景下,用户翻到第 200 页(每页 25 条)时,OFFSET 4999 已经明显卡顿;到第 1000 页,响应可能超 3 秒甚至超时。

  • 不是 TP 框架问题,是 SQL 分页模型本身在大数据量下的通病
  • paginate() 不支持自动改写为游标分页,得手动绕开
  • 如果表没合适单调递增字段(比如 idcreate_time),游标分页也难落地

ThinkPHP 实现游标分页的最小可行写法

核心思路:不用 OFFSET,改用 WHERE id > ? ORDER BY id LIMIT N,靠上一页最后一条记录的 id 做“锚点”。

示例(TP 6.x):

PHP
PHP

编写健壮的PHP代码,规避类型转换陷阱、数组怪癖及常见安全漏洞。

下载

立即学习PHP免费学习笔记(深入)”;

$lastId = input('last_id', 0, 'intval');
$perPage = 20;
$list = Db::name('article')
    ->where('id', '>', $lastId)
    ->order('id ASC')
    ->limit($perPage)
    ->select();
// 返回数据 + 下一页的 last_id(即本页最后一条的 id)
  • 必须确保排序字段有索引,且值唯一或基本不重复(id 最稳妥,create_time 要加 id 作为第二排序条件防歧义)
  • 不能用 DESC 方向做“上一页”,得反向查(比如上一页实际是 WHERE id ),逻辑要自己兜住
  • input('last_id') 必须校验非负整数,否则 SQL 注入风险直接暴露

游标分页和传统分页在 ThinkPHP 中的兼容处理

业务不可能一夜全切游标分页——搜索页要跳页、后台管理要页码输入,这些还得靠 paginate();但列表流加载(如信息流、订单流)必须上游标。

  • 不要强行统一接口返回格式,游标分页天然不带总条数、无总页数,硬塞 total 字段反而误导前端
  • 共用一个控制器方法?可以,但要用参数区分模式:type=cursor vs type=page,路由或中间件提前拦截判断
  • 注意缓存键设计:游标分页的缓存 key 必须包含 last_idlimit,不能只按 page=1 缓存
  • TP 的 withTotalCount(false) 可关掉 count 查询,但只是省一次 SQL,没解决 offset 问题,别误以为这是优化

容易被忽略的边界情况和线上踩坑点

游标分页不是设个 last_id 就万事大吉,这几个点上线后才暴雷:

  • 新数据插入导致“漏数据”:用户滑到末尾时,另一端刚插入几条 id 更小的记录,下次请求 last_id 之后就跳过了——解决方案是让前端传“时间戳+id”双锚点,或强制按 create_time DESC, id DESC 排序
  • 删除记录造成“重复数据”:A、B、C 三条记录,用户看完 A B 后 B 被删,再请求 last_id=A.id 会把 C 当作下一条,但 B 缺失导致 C 被重复刷出——本质是游标分页不保证全局一致性,需接受最终一致
  • TP 的 order() 如果写成 order('create_time desc, id desc'),但数据库里 create_time 是 datetime(0),而 PHP 写入时带毫秒,排序错乱——统一用 datetime(3) 或全切 id 排序最稳

游标分页真正的门槛不在代码怎么写,而在你愿不愿意放弃“第 N 页”这个思维惯性,以及能不能跟产品讲清:滚动加载没有“跳到第 87 页”的能力,只有“继续往下看”。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

9184

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

5561

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2015

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

3448

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

4114

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

3231

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4577

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

3582

2023.11.13

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

20

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn