登录 立即注册

首页 > 绿虎论坛 > 软件开发 > 编程语言 > PHP (发帖)

标题: thinkphp翻页过慢的解决方案

作者: @Ta

时间: 02-18 18:41发布,02-18 18:42修改

点击: 225

第一个方法肯定考虑从/thinkphp/library/think/db/Query.php 下手,改为子查询

本次采用的是数据分表法,对于大容量内容翻页慢, 就是limit的问题,比如:limit 150000,10

将主键列复制
对这个表进行分页

	$results = db('content_copy')
    		->order('id')
    		->paginate(15,false,[
                'query'=>request()->param()
            ]);

取出数据id

$view_id = implode(',',array_column($results->items(), 'id'));

查询内容

$results2 = db('content')
    		->where('id','in',$view_id)
    		->select();

回写

$results->setitems($results2);

setitems需要在thinkphp/library/think/Paginator.php
增加

public function setitems($items)
    {
        return $this->items = Collection::make($items);
    }

当然了方法很多,这个方法也不算多好,想省事还得做触发器,而且还有搜索分页方面的问题,如果手撸一个分页函数似乎也是不错的选择


[隐藏样式|查看源码]


『回复列表(3|隐藏机器人聊天)』

1. 每次都需要复制主键列吗
我有一个主表大概有几百万条数据。
关联查询的表有九个。
也是遇到翻页有点慢。感觉也没有什么好的解决办法。
(/@Ta/2025-02-19 03:13//)

2. 遇到过。没试过怎么解决!
(/@Ta/2025-02-19 09:10//)

3.

@淡然,关联的多,需要更复杂的处理逻辑,二次查询等等,我这个属于最简单的,只是不想破坏tp的其他业务逻辑才做简单修改,新建表复制主键列,原表做触发器关联新表即可,增减内容自动操作

(/@Ta/2025-02-19 10:10//)

回复需要登录

2月21日 23:49 星期五

本站由hu60wap6驱动

备案号: 京ICP备18041936号-1