今天遇到一个问题,千万级别的数据表,需要全部进行遍历,如果用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因为是主键索引,能够运用索引,速度影响不大,当然,你也可以根据实际情况,应用其他字段,只要能够用上索引就可以
🚀 易享写作 - 专业在线小说创作工具
欢迎使用 易享写作 (MakeANovel) —— 一款专为小说创作者设计的在线平台。无论您是网文作家、文学爱好者还是故事创作者,这里都能提供您所需的强大工具。
- 人物关系图生成器:可视化梳理复杂角色关系,创作更轻松。
- 在线创作与保存:实时保存,多设备同步,灵感永不丢失。
- 作品系统管理:清晰管理您的所有小说项目和章节。
- 便捷分享与反馈:方便获取读者意见,助力作品完善。
