androidstudio启动不了avd【数据库】MySQL100万条记录全表遍历---⾦⼭⾯试题docker与传统虚拟机的区别
今天做⼀个业务需求的逻辑处理,需要对MySQL全表进⾏遍历,数据规模百万级别,为⽅便描述,这张表就⽤ a 来代替吧
结合⾃⼰的思路和⼀些资料,在这⾥记录⼀下⽅案的进化史
⼀、直接 select * from a ; 肯定不⽤多说了,估计还没拿完,内存就爆了,对这种数量级的表不现实。
⼆、分页式循环遍历
select * from a limit 0,1000;
select * from a limit 1000,1000。
在代码中,循环地使⽤这种模式的sql去遍历表,虽然可以实现,但显然这种⽅式是没法⽤到索引,越往后遍历性能会越低。
三、带索引链式遍历,由于where条件中的id字段有索引,对于⽐较靠后的数据,查询性能将会轻松提升很多
select * from a where id > 0 order by id limit 10000;
假设上⼀次查询得到的结果集中,最后⼀条数据的id为10001
select * from a where id > 10001 order by id limit 10000;
那初步的优化⽅案就很容易想到了,id有索引,⽽且是⾃增的,就从id=1开始遍历,结果集以id升序排列,然后根据结果集最后⼀条数据的id,继续下⼀次遍历,依此类推,直到遍历完成
缺点:下次遍历必须知道上次遍历的最后⼀个id的值,也就是前后遍历形成了⼀个依赖链,这将导致⽆法实现遍历⾏为之间的并⾏操作。
四、id分区多线程遍历
traffic和transport区别可以尝试进⾏ID的区间划分,有了ID的分区各个分区的查询就不存在必要的关联性了。jquery mobile select
⽐如,第⼀个线程遍历id区间为1-10000的数据,第⼆个线程遍历id区间为10001-20000的数据,依此类推,直到遍历到最⼤id。这样就可以实现多个线程并⾏操作,性能也许会⼤⼤提升。
到表中最⼤最⼩id,确定id区间
select min(id),max(id) from a ;
多线程遍历,每个线程每批次拿10000条记录,从min(id)开始,到max(id)结束
八进制与二进制转换计算器
线程1:
select * from a where id >= 1 and id <= 10000;
线程2:
mysql面试题sqlselect * from a where id >= 100001 and id <=20000;
但不能说⽅案四⼀定⽐⽅案三好,要根据实际情况进⾏选择。⽅案四需要考虑ID的区间⼤⼩和SQL并⾏查询的线程数(数据库压⼒)。
⽽对于存储过程或游标之类,个⼈认为移植性和通⽤性不是很好,就没研究那⽅⾯的。
先写到这⾥,后续有什么好的⽅案,再补上!
参考:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。