记得以前有一个项目套了3层循环,每层循环中还有不少的数据库查询,导致效率低下,页面打开速度很慢,服务器资源也占用很大,只能想办法进行优化。
其实也很简单就是把重复的查询放在循环外,把数据先查询出来放在数组中,循环中的数据库查询改成查询数组,效率得到很大的提升。
举个例子:
我们要列出操作日志列表,日志表中存了用户ID没有存用户姓名,要根据用户ID查询出用户表中的用户姓名,可能我们会这样写:
foreach ($log_list as $k=>$v){
$log_list[$k]['username'] = db('user')->where('userid',$v[userid])->find()['userid'];
}
这样写的话,每循环一次就会产生一次数据库查询。
优化之后只用查询一次用户表就可以达到同样的效果,下面是优化之后的代码:
$user_array = db('user')->column('username','userid');
foreach ($log_list as $k=>$v){
$log_list[$k]['username'] = $user_array[$v[userid]];
}
我们可以看到我们先把用户表查询出来的数据存在数组中,循环中只调用了数组。
在数据比较少时效率提升不明显,但是当数据量比较大,同时又有很多层的循环时,效果还是比较显著的。
转载请注明:七维网络 » thinkphp循环中减少查询提高效率的一种方法