今天遇到一个问题,千万级别的数据表,需要全部进行遍历,如果用limit offset,count的话,无疑在翻到一定页数,也就是offset到达一定的值之后,mysql的查询速度会变得非常的慢。
$offset=0; $count = 5000; do { $sql = 'select id,uid from test_table limit ' . $offset . ',' . $count; $res = $obj->query($sql); if (empty($res)) { break; } // 处理$res数据start // 处理$res数据end $offset += $count; } while(true);
为了解决这个问题,运用了一种技术方案,即,保持count, 加上带索引的有序检索条件,如:
$count = 5000; $id = 0; do { $sql = 'select id,uid from test_table where id>' . $id . ' limit ' . $count . ' order by id asc'; $res = $obj->query($sql); if (empty($res)) { break; } // 处理$res数据start // 处理$res数据end $id = $last_id; // $last_id中最后一条记录的id } while(true);
通过这种方式,避免了offset过大的问题,且id因为是主键索引,能够运用索引,速度影响不大,当然,你也可以根据实际情况,应用其他字段,只要能够用上索引就可以