有一天,我在循环中查询了数据库,然后我就悲剧了
问题
在开发中,经常会遇到在循环中查询数据库的操作,刚开始的时候觉得没什么。
当数据量大起来后,这种编程方式将会是应用的性能瓶颈。
那么该如何避免不必要的查询呢?
场景
这样一张表
product_props
字段 | 类型 | 备注 |
---|---|---|
id | int | |
product_id | int | 产品id |
pnid | int | 属性Id |
pvid | int | 属性名称id |
有这样一个数据
id | product_id | pnid | pvid |
---|---|---|---|
1 | 1 | 1 | 1 |
2 | 1 | 2 | 2 |
3 | 1 | 3 | 3 |
4 | 1 | 4 | 4 |
5 | 1 | 5 | 5 |
6 | 2 | 6 | 6 |
7 | 2 | 7 | 7 |
8 | 2 | 8 | 8 |
然后来了一组新数据,它需要对产品1进行修改或者写入。
product_id | pnid | pvid |
---|---|---|
1 | 1 | 10 |
1 | 3 | 30 |
1 | 12 | 21 |
1 | 31 | 33 |
如果存在该组数据那么更新,如果不存在那么写入。
方法
- 一般的方法
$product = [
[
'product_id'=>1,
'pnid'=>1,
'pvid'=>10
],
[
'product_id'=>1,
'pnid'=>3,
'pvid'=>30
],
[
'product_id'=>1,
'pnid'=>12,
'pvid'=>21
],
[
'product_id'=>1,
'pnid'=>31,
'pvid'=>33
],
];
foreach ( $product as $p) {
//如果存在则更新
if ( $this->count($p) ) {
$this->update($p);
} else {
$this->insert($p);
}
}
从业务上来说,这么做没问题的。
但是当product_props表的数据量越来越大,而每组数据都去查一次的话,那是非常恐怖的。
那么要如何去避免呢?
- 另一种解决方法
$product = [
[
'product_id'=>1,
'pnid'=>1,
'pvid'=>10
],
[
'product_id'=>1,
'pnid'=>3,
'pvid'=>30
],
[
'product_id'=>1,
'pnid'=>12,
'pvid'=>21
],
[
'product_id'=>1,
'pnid'=>31,
'pvid'=>33
],
];
//获取product_id为1的数据
$oldData = $this->get(1);
/**
* 这里会把数据组成以pnid为键的数组
*/
$oldKeyData = array_column($oldData,NULL,'pnid');
$update = [];
$insert = [];
foreach ( $product as $p) {
if ( isset($oldKeyData[$p['pnid']]) ) {
$updatep[] = $p;
} eles {
$insert[] = $p;
}
}
//进行更新和删除
...
可以看到,这样就完美的避免了在循环中进行查询的操作了。
在开发中,有很多操作是可以通过代码的层面去解决性能问题的,而这需要大家开动大脑了。
也许这个算不得什么干货,已经懂的看看笑笑就好,哈哈哈。
PS:你的赞是我创作的动力!
为什么同是9年义务教育别人就那么优秀?
想知道请关注订阅号:Buger(关注送 laravel,linux,nginx 等学习资料!!!)
回复'学习',推荐你2本书。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: