mysql循环遍历获取_MySQL 全表遍历

今天做一个业务需求的逻辑处理,需要对MySQL全表进行遍历,数据规模百万级别,为方便描述,这张表就用 a 来代替吧

结合自己的思路和一些资料,在这里记录一下方案的进化史

一、直接遍历拿出所有的数据

select * from a ;

这个肯定不用多说了,估计还没拿完,内存就爆了,对这种数量级的表不现实

二、分页式循环遍历

select * from a limit 0,1000;select * from a limit 1000,1000。

在代码中,循环地使用这种模式的sql去遍历表,虽然可以实现,但显然这种方式是没法用到索引,越往后遍历性能会越低。

三、带索引链式遍历

select * from a where id > 0 order by id limit 10000;select * from a where id > 10000 order by id limit 10000;

好,既然没用到索引,那就带上索引遍历。

类似的查询效果,由于where条件中的id字段有索引,对于比较靠后的数据,查询性能将会轻松提升很多(有人说是百倍左右,我没测试过就不说具体多少了)

那初步的优化方案就很容易想到了,id有索引,而且是自增的,就从id=1开始遍历,结果集以id升序排列,然后根据结果集最后一条数据的id,继续下一次遍历

四、id分区多线程遍历

参考:

共同学习,共同进步,若有补充,欢迎指出,谢谢!

今天做一个业务需求的逻辑处理,需要对MySQL全表进行遍历,数据规模百万级别,为方便描述,这张表就用 a 来代替吧 结合自己的思路和一些资料,在这里记录一下方案的进化史 一、直接遍历拿出所有的数据 select * from a ; 这个肯定不用多说了,估计还没拿完,内存就爆了,对这种数量级的表不现实 二、分页式循环遍历 select * from a limit 0,1000;select * from a limit 1000,1000。 在代码中,循环地使用这种模式的sql去遍历表,虽然可以实现,但显然这种方式是没法用到索引,越往后遍历性能会越低。 三、带索引链式遍历 select * from a where id > 0 order by id limit 10000;select * from a where id > 10000 order by id limit 10000; 好,既然没用到索引,那就带上索引遍历。 类似的查询效果,由于where条件中的id字段有索引,对于比较靠后的数据,查询性能将会轻松提升很多(有人说是百倍左右,我没测试过就不说具体多少了) 那初步的优化方案就很容易想到了,id有索引,而且是自增的,就从id=1开始遍历,结果集以id升序排列,然后根据结果集最后一条数据的id,继续下一次遍历 四、id分区多线程遍历 参考: 共同学习,共同进步,若有补充,欢迎指出,谢谢!
经验分享 程序员 微信小程序 职场和发展