在開發中,經常會遇到在迴圈中查詢資料庫的操作,剛開始的時候覺得沒什麼。
當資料量大起來後,這種程式設計方式將會是應用的效能瓶頸。
那麼該如何避免不必要的查詢呢?
這樣一張表
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本書。