thinkphp大数据分页88页优化
ThinkPHP分页总数88页优化方案
一、基础分页正常渲染(原生自带分页,88页会自动生成分页栏)
1. 控制器分页代码(TP5/TP6通用)
php
// list 数据分页,每页10条
$list = Db::name('table')
->paginate(10);
// 赋值模板
$this->assign('list', $list);
2. 模板输出分页
html
{$list|raw}
默认分页会自动显示:首页、上一页、中间页码、下一页、末页,88页时中间只展示附近几页,不会一次性输出1-88全部数字,页面不会臃肿。
二、分页样式自定义(解决页码太多显示杂乱)
方式1:自定义分页模板(推荐,控制显示页码数量)
1. 创建分页模板 view/pagination.html
html
<div class="pagination">
{if $list->currentPage() > 1}
<a href="{$list->url(1)}">首页</a>
<a href="{$list->url($list->currentPage()-1)}">上一页</a>
{/if}
<!-- 只展示当前页前后5页,88页不会全部输出 -->
{for $i = max(1,$list->currentPage()-5); $i <= min($list->lastPage(),$list->currentPage()+5); $i++}
{if $i == $list->currentPage()}
<span class="current">{$i}</span>
{else}
<a href="{$list->url($i)}">{$i}</a>
{/if}
{/for}
{if $list->currentPage() < $list->lastPage()}
<a href="{$list->url($list->currentPage()+1)}">下一页</a>
<a href="{$list->url($list->lastPage())">末页({$list->lastPage()})</a>
{/if}
<span>共{$list->total()}条,{$list->lastPage()}页</span>
</div>
2. 控制器指定分页模板
php
$list = Db::name('table')->paginate(10, false, ['type' => 'app\admin\view\pagination']);
方式2:简洁分页(只显示上下页+跳转框,适合几十上百页)
增加页面跳转输入框,用户直接输入页码跳转,不用翻几十次:
html
<form action="" method="get" style="display:inline-block;margin-left:10px;">
<input type="number" name="page" min="1" max="{$list->lastPage()}" placeholder="输入页码">
<button type="submit">跳转</button>
</form>
三、大数据88页性能优化(关键!数据量大分页卡顿)
问题:limit 偏移越大,查询越慢(page=88 等价 limit 870,10)
优化方案
1. 使用主键id游标分页(大数据首选)
不再依赖page分页,记录上一页最大ID,避免大偏移:
php
// 第一页
$list = Db::name('table')->limit(10)->order('id desc')->select();
// 下一页传参数 last_id
$list = Db::name('table')
->where('id','<',$last_id)
->limit(10)
->order('id desc')
->select();
缺点:不支持直接跳转到第88页,适合前端无限滚动。
2. 给排序字段建立索引
sql
ALTER TABLE `table` ADD INDEX idx_create_time (create_time);
分页排序字段无索引是卡顿核心原因。
3. 限制最大可跳转页码
业务上极少有人翻到88页末尾,可前端判断,页码大于50提示筛选条件缩小范围。
4. 增加筛选条件减少总页数
提供时间、状态、关键词搜索,从根源降低总页数,最实用。
四、TP6 分页自定义简化写法
php
// 简洁分页,只输出上下页,不带全部数字页码
$list = Db::name('table')
->paginate([
'list_rows' => 10,
'simple' => true // 简洁分页:仅上一页/下一页,无数字页码
]);
开启 simple=true 后不会渲染1~88所有页码,页面干净。
五、前端样式优化,防止分页栏过长
css
.pagination a, .pagination span {
padding:4px 10px;
margin:0 3px;
border:1px solid #eee;
}
.pagination .current {
background:#007bff;
color:#fff;
border-color:#007bff;
}
.pagination {
margin-top:15px;
overflow-x:auto; /* 页码过多横向滚动 */
padding:8px 0;
}
总结
1. 单纯展示88页:自定义分页模板,只显示当前页前后5页,加跳转框;
2. 页面追求简洁:开启 simple 简洁分页,无数字页码;
3. 查询卡顿(88页加载慢):加索引、游标分页、增加搜索筛选减少数据量;
4. 用户体验:增加页码跳转输入框,不用一页页翻到88页。
更多推荐
所有评论(0)