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

作者: 方圆百里找对手 | 来源:发表于2017-05-27 09:02 被阅读123次

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

    相关文章

      网友评论

        本文标题:适用于Yii2的千万级数据秒分页

        本文链接:https://www.haomeiwen.com/subject/moiffxtx.html