Loading

适用于Yii2的千万级数据秒分页

首先SQL原型如下

SELECT t1.* FROM item t1, (SELECT id FROM item WHERE id>100 LIMIT 10000,20 ) t2 WHERE t1.id=t2.id;

SQL子查询数据并分页,只取主键,然后在获取 该表所有数据,在数据量非常大的时候实现秒查,如果无条件分页,即主键>0,千万级数据在0.00X秒左右即可搞定。

在Yii2中就不能使用ActiveDataProvider了,因为他会自动分页,并不适用本SQL;

use app\models\User;
use yii\data\Pagination;
//构造子查询
$subQuery = User::find()->select('id')->where('id>0');
//取总数
$count = $subQuery->count();
//构造分页
$pagination = new Pagination(['totalCount' => $count]);
$subQuery->offset($pagination->offset)->limit($pagination->limit);
$query = User::find()->select('*')->from(['t1' => User::tableName(), 't2' => $subQuery])->where('t1.id=t2.id')->all();
$users = $query->all();
print_r($users);

其实是利用了Yii2自带的子查询来查询,生成的SQL跟上面一样,当然不能像手写SQL一样灵活,不过目的实现了,分页要在子查询中分。

posted @ 2020-04-01 11:55  方圆百里找对手  阅读(324)  评论(0编辑  收藏  举报