起因: 甲方爸爸觉得功能A太慢了
代码结构:以用户分组,每组一个队列,执行三个表的fullscan数据,合并数据并生成新数据。
分析:用户量大概4000+,fullsacan数据大概10w,主要耗时在于fullscan查询和队列消耗
优化步骤:
1. 全局: 由于大量用户并不符合创建队列需求,以hash表方式记录每个用户是否符合创建队列,减少队列生成数量并提高队列效率
2. 局部:以findOne在findAll前进行预查询,以判断当前用户是否有符合条件的数据,并尽量增加可筛选条件,降低findOne的查询范围
结果:效率提升很多,优化前40分钟的任务,现在2分钟就执行完了
实现时间:4个工时
测试时间:8个工时
结论:
1. 队列的创建,排队,销毁等消耗不容忽视
2. fullscan的效率极低,要尽量避免或想办法替代
3. 又一次使用hash表解决效率问题(上一次是数据查重),感觉hash表真是个好东西~ 还没试过跳表,如果有机会接触更大量的数据就能用到了吧
4. 代码功能保持独立性很重要,这次有关于多种数据类型相似的操作方法,我是分开写的,有考虑是否要合并在一起,后来想到易读性很差也不利于维护容易出bug,还是分开写了,好在重复率不算太高,数量不大,只是结构相似
5. findOne使用了优化过的取值算法,findAll是全遍历吧,所以效率会高很多
6. 要多些极简耐用的代码~ 🍯
网友评论