偏移offset查询优化
最近CTO说要优化一下关于offset
的查询效率,情况是这样的,有一张10万多条数据的表,原本的查询方式是这样的:
<?php
$offset=0;
$limit=100;
while(true){
// 这里就是模拟一下偏移量查询
$dataBaseData=$model->offset($offset)->limit($limit);
if(!$dataBaseData){
break;
}
$offset+=$limit;
}
这样的查询有一个很大的问题,那就是在查询9900-10000这样的数据时,也是遍历整张表的,查询效率非常低,所以优化的核心思路也非常简单,就是使用索引,而一般的索引就是id
,修改后的查询条件如下:
$offsetId=0;
$limit=100;
while(true){
$dataBaseData=$model->where("id > {$offsetId}")->order("id asc")->limit($limit);
if(!$dataBaseData){
break;
}
// 更新判断条件,从下一个id开始
$offsetId=end($dataBaseData)['id'];
}
其实核心思路很简单,就是将原先的偏移量修改为where
,这样就可以走索引那一层,比起原先全表遍历的速度更快。