适用于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一样灵活,不过目的实现了,分页要在子查询中分。