您的当前位置:首页正文

不要在循环中访问数据库,这样会严重影响数据库性能

2024-11-08 来源:个人技术集锦

不要在循环中访问数据库,这样会严重影响数据库性能

先说一个可能会在循环中查询数据库的应用场景:
购物网站,有两个基本表,一个表存储商品的基本信息,比如商品价格,商品描述…,一个表存储商品的图片url,当我们要获取商品的列表,展示商品的基本信息及商品的图片时,我们可能会用以下的
伪代码来实现:

先去获取商品列表,
然后用for循环来循环商品列表,
在循环体内根据商品的id,再去获取该商品id的图片,
然后再将商品的基本信息和查询出来的商品图片数组拼接成一个对象

这样的实现方案会严重影响数据库的性能,因为for循环内部每次都要查询一遍商品图片表,如何商品列表里面有一百条数据,我们就相当于要查询100遍商品图片表,查询数据库需要占用时间,消耗资源,连接数据库也需要占用时间,消耗资源,所以说会严重影响数据库的性能

解决方案:
sql语句使用where in先把商品列表里面所有商品id的所属图片一次性查询出来,然后再在业务逻辑里面把图片和图片所属的商品分好。

举个例子:
商品列表里面有3件商品,id分别为1,2,3,我们就可以这样写sql语句,

SELECT goods_id,picture_url FROM goods_picture WHERE goods_id IN ("1","2","3")

其中goods_picture为商品图片表
然后再把查询出来的所有图片根据其所属的商品的id分开,并且把商品图片和商品的的其他信息封装成一个json对象就行

下面是我项目里面封装好商品图片和商品其他信息的nodejs代码:

for(var i = 0; i < result.length; i++) {
	for(var j = 0; j < result_picture.length; j++) {
		if(result_picture[j].goods_id == result[i].id) {
			if(result[i]['image_url']) {
				result[i]['image_url'].push(result_picture[j].picture_url);
			} else {
				var temporaryArray = [];
				result[i]['image_url'] = temporaryArray;
				result[i]['image_url'].push(result_picture[j].picture_url);
			}
		}
	}
}

代码仅供参考噢~

Top