适用于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();

        $articles = $query->all();

        print_r($articles);

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

未经允许不得转载:SuperMan's blog » 适用于Yii2的千万级数据秒分页

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址