慎用递归,BIWEB分类优化的经历,耗时10分钟的运算提升到0.35秒

最近公司在做B2B的门户网站,翻遍了阿里,慧聪等知名B2B网站,发现他们的分类各有各一套,众多零散,为了跟更多大众的习惯吻合,我们还是采用了阿里的分类。随着数据入库的过程,问题就出来了。

我们录了36个大类的分类数据的时候,数据库里的分类数据已经达到8200多条的时候,刷新一次估计要5-6分钟了。这实在是让人无法忍受了,遂决定做做优化,再继续录。

首先,8200条数据并不算多啊,光数据库不可能这么慢,测试了一下,取值确实很快,慢就慢在取值后的数据重组,因为我们要把数据按照一级分类,二级分类,三级分类的父子关系重组数据,要不然就有可能这个分类的子类,跑到别的分类下去了。

这个重组之前用的是递归做的,也就是拿出1个分类,就要遍历整个数据8200条,检查谁是你的子类,把你的子类搬到父类的后面,这个动作在数据量小的时候,基本上是没问题的,当8200条的时候,就发生了,8200*8200次循环,产生了6400万次循环,耗时760秒,要10分钟呢,那谁受得了啊。

第一次优化思路是,如果已经找到分类被提取的数据,当然就没必要再参与循环了,可以从循环中剔除,降低循环次数,结果经过一通调试,总算正常的把已经提取的分类剔除了,循环次数逐级递减。不过这个做法,只把6400万的循环降到3200万次,减少了一半,耗时当然也是减了一半,耗时5分钟,这还是让人无法接受。

重新理思路,发现用递归遍历,实在没法优化了,看看放弃递归能不能做,经过我聪明的大脑转换,用了两次遍历,第一次遍历将所有的数据按照父类子类的关系重组成三维数组,第二次遍历将重组的三维数组按照关系重排列二维数组,整个过程只用了两次遍历,耗时0.35秒,真是效率的极大的提升啊!

这个事例告诉我们,递归在小数据量的时候,不会有太大的影响,在大数据量的情况下,应尽量避免使用递归。新的分类重组方法,将在BIWEB v5.88底层库php_common.php中的formatTypeList()提供,有兴趣的朋友,可以将BIWEB v5.87的formatTypeList()和BIWEB v5.88对比一下,就可以知道奥妙在哪里了。

这个问题解决,用掉了我2天时间,还是很值得大家借鉴的。

出自:http://www.biweb.cn ,作者:萧峰(萧大侠)



BIWEB是跨设备跨平台兼容,一站多发,操作方便的WEBAPP手机网站系统

BIWEB自2005年推出后,经过不断的在各种大型项目中实践、总结、开发设计出来的一个快速开发、简单易用的面向对象的企业应用级PHP MVC建站系统。至2013年8月BIWEB推出webapp版本,标志着BIWEB从电脑网站系统正式步入移动端应用系统时代。

联系我们

上海徐汇区漕溪路165号1209室

13367735767,

info@biweb.cn

客服:1953680398

Back to Top