不要在循環中訪問數據庫,這樣會嚴重影響數據庫性能
先說一個可能會在循環中查詢數據庫的應用場景:
購物網站,有兩個基本表,一個表存儲商品的基本信息,比如商品價格,商品描述…,一個表存儲商品的圖片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對象就行