【小乾貨】一般的在迴圈中避免查詢資料庫的操作

simpleT發表於2019-06-13

在開發中,經常會遇到在迴圈中查詢資料庫的操作,剛開始的時候覺得沒什麼。

當資料量大起來後,這種程式設計方式將會是應用的效能瓶頸。

那麼該如何避免不必要的查詢呢?

這樣一張表

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本書。

三海

相關文章